UDP mit LNEt
-
- Beiträge: 12
- Registriert: Mo 22. Mär 2010, 19:42
UDP mit LNEt
Hallo zusammen,
ich möchte mit der UDP Komponente aus dem LNet-Paket zwischen zwei Rechnern einen Text austauschen,
möchte hier im Forum aber nicht darüber diskutieren, ob UDP dafür sinnvoll ist oder nicht. Mir geht es darum, dass ich
mit einem funktionierenden Programm UDP mal verstehe.
Also: ich habe die UDP Komponente auf dem Formular, ich trage Host ("localhost" oder "192.168.1.1" ein und ich trage einen Port "100" ein).
Eingehende Nachrichten kann ich über:
procedure TForm1.UPDReceive(aSocket: TLSocket);
var s : String;
begin
aSocket.GetMessage(s);
Memo1.Append(s);
end;
empfangen.
1) Wie sende ich eine Nachricht?
2) Brauche ich die IP Adresse wirklich? UDP ist doch verbindungslos.
Vielen Dank schonmal.
Martin
ich möchte mit der UDP Komponente aus dem LNet-Paket zwischen zwei Rechnern einen Text austauschen,
möchte hier im Forum aber nicht darüber diskutieren, ob UDP dafür sinnvoll ist oder nicht. Mir geht es darum, dass ich
mit einem funktionierenden Programm UDP mal verstehe.
Also: ich habe die UDP Komponente auf dem Formular, ich trage Host ("localhost" oder "192.168.1.1" ein und ich trage einen Port "100" ein).
Eingehende Nachrichten kann ich über:
procedure TForm1.UPDReceive(aSocket: TLSocket);
var s : String;
begin
aSocket.GetMessage(s);
Memo1.Append(s);
end;
empfangen.
1) Wie sende ich eine Nachricht?
2) Brauche ich die IP Adresse wirklich? UDP ist doch verbindungslos.
Vielen Dank schonmal.
Martin
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: UDP mit LNEt
Und WLAN braucht Kabel ...martinjakobs hat geschrieben:2) Brauche ich die IP Adresse wirklich? UDP ist doch verbindungslos.
Was du meinst ist, dass es bei UDP normalerweise keine permanenten Sockets gibt ... aber gerade deswegen brauchst du ja die IP - wohin sollen sonst Pakete geschickt werden?
-
- Beiträge: 12
- Registriert: Mo 22. Mär 2010, 19:42
Re: UDP mit LNEt
Also: In der Komponente muss man IP und Port eintragen.
Bei TCP (Client/Server) muss der Client die IP des Servers kennen.
UDP ist aber ein Broadcast-Protokoll, schickt seine Pakete also
ins ganze Netz. Demzufolge muss der Sender nicht die IP des Servers
kennen. OK?
Die Komponente hat aber ein Feld IP. Welche IP (das ist meine Frage)
sollte aber in dieses Feld eingetragen werden? Die eigene? Das wäre
ja Unsinn. Die IP des Empfängers? Das wiederspräche dem UDP-Protokoll.
Soweit verstanden?
Nun weiß ich aber immer noch nicht (Teil 1 meiner Frage), wie ich eine Nachricht mit dieser Komponente
sende. Es gibt keine "sendMessage" Prozedur wie bei der TCP Komponente.
Bei TCP (Client/Server) muss der Client die IP des Servers kennen.
UDP ist aber ein Broadcast-Protokoll, schickt seine Pakete also
ins ganze Netz. Demzufolge muss der Sender nicht die IP des Servers
kennen. OK?
Die Komponente hat aber ein Feld IP. Welche IP (das ist meine Frage)
sollte aber in dieses Feld eingetragen werden? Die eigene? Das wäre
ja Unsinn. Die IP des Empfängers? Das wiederspräche dem UDP-Protokoll.
Soweit verstanden?
Nun weiß ich aber immer noch nicht (Teil 1 meiner Frage), wie ich eine Nachricht mit dieser Komponente
sende. Es gibt keine "sendMessage" Prozedur wie bei der TCP Komponente.
Re: UDP mit LNEt
http://synapse.ararat.cz/doc/help/blcks ... ocket.html" onclick="window.open(this.href);return false;
http://synapse.ararat.cz/doku.php/publi ... pmulticast" onclick="window.open(this.href);return false;
http://synapse.ararat.cz/doku.php/publi ... :udpserver" onclick="window.open(this.href);return false;
http://en.wikipedia.org/wiki/IP_multicast" onclick="window.open(this.href);return false;
http://synapse.ararat.cz/doku.php/publi ... pmulticast" onclick="window.open(this.href);return false;
http://synapse.ararat.cz/doku.php/publi ... :udpserver" onclick="window.open(this.href);return false;
http://en.wikipedia.org/wiki/IP_multicast" onclick="window.open(this.href);return false;
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: UDP mit LNEt
Um meine Aussage zu verteidigen und theo's Links zu untermalen: UDP ist nicht gleichzusetzen mit Multicast. Sonst wäre das Internet ziemlich überlastet mit den vielen Computerspielen, die auf UDP setzen ........
-
- Beiträge: 12
- Registriert: Mo 22. Mär 2010, 19:42
Re: UDP mit LNEt
Aha, da komme ich dem Problem ja schon etwas näher. Also: UDP <> Multicast, ok, schau ich mal nach.
Wusste ich bislang nicht, dass es da Unterschiede gibt. Ich klick mich gleich mal durch die Links von oben.
Frage 1: Ist UDP damit denn verbindungsorientiert oder nicht?
Dann ging es mir um die LNEt Komponenten, nicht um Synapse. Ich hab mir die LNet-Komponenten
installiert und würde erstmal gerne mit denen arbeiten. ALso, gibt es denn da die Möglichkeit, über UDP
etwas zu senden, oder nicht.
Frage 2: Klappt das denn damit nicht?
Frage 3: Oder wisst ihr das nicht?
Frage 4: Oder soll ich eurer Meinung nach Synapse installieren?
Gruß
Martin
Wusste ich bislang nicht, dass es da Unterschiede gibt. Ich klick mich gleich mal durch die Links von oben.
Frage 1: Ist UDP damit denn verbindungsorientiert oder nicht?
Dann ging es mir um die LNEt Komponenten, nicht um Synapse. Ich hab mir die LNet-Komponenten
installiert und würde erstmal gerne mit denen arbeiten. ALso, gibt es denn da die Möglichkeit, über UDP
etwas zu senden, oder nicht.
Frage 2: Klappt das denn damit nicht?
Frage 3: Oder wisst ihr das nicht?
Frage 4: Oder soll ich eurer Meinung nach Synapse installieren?
Gruß
Martin
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: UDP mit LNEt
Oder Indy. Den mach ich noch immer am meisten.martinjakobs hat geschrieben: Frage 4: Oder soll ich eurer Meinung nach Synapse installieren?
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: UDP mit LNEt
Also bei mit hat TLUdp durchaus .Send und .SendMessage in je zwei Ausführungen.
Welche Version von lNet nimmst du denn? Bei mir müsste es 0.6.3 sein.
Welche Version von lNet nimmst du denn? Bei mir müsste es 0.6.3 sein.
Re: UDP mit LNEt
Ich habe unter Delphi schon mit Synapse gearbeitet und komme damit am besten klar.martinjakobs hat geschrieben: Frage 2: Klappt das denn damit nicht?
Frage 3: Oder wisst ihr das nicht?
Frage 4: Oder soll ich eurer Meinung nach Synapse installieren?
Es ist auch ziemlich gut dokumentiert und hat schon einige Jahre an "testing" auf dem Buckel. LNet kenne ich nicht wirklich.
Ich würde Synapse empfehlen, obwohl unter OSX und WinCE u.U. nicht alles auf Anhieb funktioniert (bei Indy afaik dasselbe)
Den Snapshot downloaden: http://synalist.svn.sourceforge.net/vie ... z?view=tar" onclick="window.open(this.href);return false;
Es bleibt natürlich die Frage, ob du mit UDP wirklich auf das richtige Pferd setzt.
-
- Beiträge: 12
- Registriert: Mo 22. Mär 2010, 19:42
Re: UDP mit LNEt
Hallo zusammen,
also, nochmal ganz konkret. Ich will UDP "ausprobieren". Dass UDP durchaus nicht die richtige Lösung sein kann,
ist mir klar.
Mit Indy9 unter Delphi klappt der Datenaustausch. Dort gibt es aber auch einen UDP-Server und einen UDP-Client.
Am liebsten würde ich Indy9 auch unter Lazarus installieren, nur das funktioniert bei mir irgendwie nicht. Warum auch immer.
Jetzt habe ich also die LNEt-Komponenten. Damit müsste es ja auch gehen.
Ich bin nun so weit, dass ich zwei Fenster mit jeweils zwei TLUDPComponenten habe.
Die eine soll senden, die andere Empfangen.
Senden:
procedure TForm1.Button1Click(Sender: TObject);
begin
LUDPComponent1.sendMessage('Hallo','192.168.1.1');
// oder
LUDPComponent1.sendMessage('Hallo','localhost');
end;
Empfangen:
procedure TForm2.UDPReceive(aSocket: TLSocket);
var s : String;
begin
Memo1.Append('Nachricht eingegangen');
// oder
aSocket.GetMessage(s);
Memo1.Append(s);
end;
Es klappt aber nicht, ich empfange keine Nachrichten. Port ist auch gesetzt.
Gruß
Martin
also, nochmal ganz konkret. Ich will UDP "ausprobieren". Dass UDP durchaus nicht die richtige Lösung sein kann,
ist mir klar.
Mit Indy9 unter Delphi klappt der Datenaustausch. Dort gibt es aber auch einen UDP-Server und einen UDP-Client.
Am liebsten würde ich Indy9 auch unter Lazarus installieren, nur das funktioniert bei mir irgendwie nicht. Warum auch immer.
Jetzt habe ich also die LNEt-Komponenten. Damit müsste es ja auch gehen.
Ich bin nun so weit, dass ich zwei Fenster mit jeweils zwei TLUDPComponenten habe.
Die eine soll senden, die andere Empfangen.
Senden:
procedure TForm1.Button1Click(Sender: TObject);
begin
LUDPComponent1.sendMessage('Hallo','192.168.1.1');
// oder
LUDPComponent1.sendMessage('Hallo','localhost');
end;
Empfangen:
procedure TForm2.UDPReceive(aSocket: TLSocket);
var s : String;
begin
Memo1.Append('Nachricht eingegangen');
// oder
aSocket.GetMessage(s);
Memo1.Append(s);
end;
Es klappt aber nicht, ich empfange keine Nachrichten. Port ist auch gesetzt.
Gruß
Martin
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: UDP mit LNEt
Hast du dir denn mal die beiliegenden Beispiele angeguckt? Da klappt UDP bei mir wunderbar. Da wird auch keine Adresse an SendMessage übergeben, sondern die normale "Host" Eigenschaft der Komponente genutzt.
-
- Beiträge: 12
- Registriert: Mo 22. Mär 2010, 19:42
Re: UDP mit LNEt
Erstmal danke für Hilfe bisher.
Ok, nach dem mitgelieferten Beispiel habe ich zuerst den "sever" aktiv geschaltet und dann den "Client" mit dem Server verbunden.
Dazu brauche ich aber die IP des Servers, oder? Der Verbindebefehl lautet ja:
LUDPComponent1.Connect('localhost',5555 );
oder
LUDPComponent1.Connect('192.168.1.1',5555 );
Was mache ich aber, wenn ich die IP des Servers (bzw. des Kommunikationspartners) nicht kenne?
Bei Indy 9 und Delphi habe ich ja eine BROADCAST Funktion, um mit die IP mitzuteilen. Bei Indy9 heißt
es einfach "Componente.Broadcast('Nachricht')".
Mein Kommunikationspartner horcht dann auf einem vereinbarten Port und empfängt die Nachricht, ohne
dass ich mich vorher bei ihm angemeldet habe.
Anders formuliert: Man kann also kommunizieren, ohne dass man die IP-Adresse des Gegenübers
kennt. Damit könnte man z.B. einen IP-losen Chat betreiben.
Wie mache ich das mit den LNET?
P.S: Ja, ich weiß, dass es wenig Sinn macht, mit Broadcast einen IP-losen Chat oder ähnliches zu betreiben.
Darum geht es mir gar nicht.
Ok, nach dem mitgelieferten Beispiel habe ich zuerst den "sever" aktiv geschaltet und dann den "Client" mit dem Server verbunden.
Dazu brauche ich aber die IP des Servers, oder? Der Verbindebefehl lautet ja:
LUDPComponent1.Connect('localhost',5555 );
oder
LUDPComponent1.Connect('192.168.1.1',5555 );
Was mache ich aber, wenn ich die IP des Servers (bzw. des Kommunikationspartners) nicht kenne?
Bei Indy 9 und Delphi habe ich ja eine BROADCAST Funktion, um mit die IP mitzuteilen. Bei Indy9 heißt
es einfach "Componente.Broadcast('Nachricht')".
Mein Kommunikationspartner horcht dann auf einem vereinbarten Port und empfängt die Nachricht, ohne
dass ich mich vorher bei ihm angemeldet habe.
Anders formuliert: Man kann also kommunizieren, ohne dass man die IP-Adresse des Gegenübers
kennt. Damit könnte man z.B. einen IP-losen Chat betreiben.
Wie mache ich das mit den LNET?
P.S: Ja, ich weiß, dass es wenig Sinn macht, mit Broadcast einen IP-losen Chat oder ähnliches zu betreiben.
Darum geht es mir gar nicht.
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: UDP mit LNEt
Es ist schon eine Weile her das ich indy9 benutzt habe, aber hier ist einer meine alten Backups:martinjakobs hat geschrieben:Hallo zusammen,
also, nochmal ganz konkret. Ich will UDP "ausprobieren". Dass UDP durchaus nicht die richtige Lösung sein kann,
ist mir klar.
Mit Indy9 unter Delphi klappt der Datenaustausch. Dort gibt es aber auch einen UDP-Server und einen UDP-Client.
Am liebsten würde ich Indy9 auch unter Lazarus installieren, nur das funktioniert bei mir irgendwie nicht. Warum auch immer.
Jetzt habe ich also die LNEt-Komponenten. Damit müsste es ja auch gehen.
http://www.stack.nl/~marcov/indy/indy9forfpc.zip" onclick="window.open(this.href);return false;
Aber das ist nur für windows. Für Linux/OSX soll man in der Richtung von Indy10 schauen.
-
- Beiträge: 12
- Registriert: Mo 22. Mär 2010, 19:42
Re: UDP mit LNEt
Danke erstmal für die Indy Beispiele, mit Indy hab ich allerdings ja schon lange programmiert.
Und Synapse gibt es auch noch, das weiß ich mittlerweile!
Aber trotzdem nochmal: Wie mache ich einen Broadcast mit den LNET-Komponenten ohne die IP des Partners zu kenne?
Na ja, ich glaube, sonst werde ich das Progrämmchen wohl wieder mit Delphi schreiben. Eigentlich wollte ich Delphi ja
den Rücken kehren, aber ....
Und Synapse gibt es auch noch, das weiß ich mittlerweile!
Aber trotzdem nochmal: Wie mache ich einen Broadcast mit den LNET-Komponenten ohne die IP des Partners zu kenne?
Na ja, ich glaube, sonst werde ich das Progrämmchen wohl wieder mit Delphi schreiben. Eigentlich wollte ich Delphi ja
den Rücken kehren, aber ....

-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: UDP mit LNEt
Entscheide dich mal, was du nun willst - broadcast oder multicast? Broadcast ist in der TCP/UDP lNet Demo nämlich ebenfalls mit drin: wenn du beim Server auf Send drückst, dann erhalten alle verbundenen Client die Nachricht.martinjakobs hat geschrieben:Aber trotzdem nochmal: Wie mache ich einen Broadcast mit den LNET-Komponenten ohne die IP des Partners zu kenne?
Um noch etwas genauer zu sein:
Code: Alles auswählen
n := TLUdp(FNet).SendMessage(aMsg, LADDR_BR);