UDP mit LNEt

Alle Fragen zur Netzwerkkommunikation
martinjakobs
Beiträge: 12
Registriert: Mo 22. Mär 2010, 19:42

UDP mit LNEt

Beitrag von martinjakobs »

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

Hitman
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

Beitrag von Hitman »

martinjakobs hat geschrieben:2) Brauche ich die IP Adresse wirklich? UDP ist doch verbindungslos.
Und WLAN braucht Kabel ...
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?

martinjakobs
Beiträge: 12
Registriert: Mo 22. Mär 2010, 19:42

Re: UDP mit LNEt

Beitrag von martinjakobs »

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.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: UDP mit LNEt

Beitrag von theo »

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;

Hitman
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

Beitrag von Hitman »

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 ........

martinjakobs
Beiträge: 12
Registriert: Mo 22. Mär 2010, 19:42

Re: UDP mit LNEt

Beitrag von martinjakobs »

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

marcov
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

Beitrag von marcov »

martinjakobs hat geschrieben: Frage 4: Oder soll ich eurer Meinung nach Synapse installieren?
Oder Indy. Den mach ich noch immer am meisten.

Hitman
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

Beitrag von Hitman »

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.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: UDP mit LNEt

Beitrag von theo »

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?
Ich habe unter Delphi schon mit Synapse gearbeitet und komme damit am besten klar.
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.

martinjakobs
Beiträge: 12
Registriert: Mo 22. Mär 2010, 19:42

Re: UDP mit LNEt

Beitrag von martinjakobs »

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

Hitman
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

Beitrag von Hitman »

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.

martinjakobs
Beiträge: 12
Registriert: Mo 22. Mär 2010, 19:42

Re: UDP mit LNEt

Beitrag von martinjakobs »

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.

marcov
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

Beitrag von marcov »

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.
Es ist schon eine Weile her das ich indy9 benutzt habe, aber hier ist einer meine alten Backups:
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.

martinjakobs
Beiträge: 12
Registriert: Mo 22. Mär 2010, 19:42

Re: UDP mit LNEt

Beitrag von martinjakobs »

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 .... :(

Hitman
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

Beitrag von Hitman »

martinjakobs hat geschrieben:Aber trotzdem nochmal: Wie mache ich einen Broadcast mit den LNET-Komponenten ohne die IP des Partners zu kenne?
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.

Um noch etwas genauer zu sein:

Code: Alles auswählen

n := TLUdp(FNet).SendMessage(aMsg, LADDR_BR);

Antworten