Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy UDP macht mich noch wahnsinnig (https://www.delphipraxis.net/188375-indy-udp-macht-mich-noch-wahnsinnig.html)

Marco Steinebach 25. Feb 2016 16:15

Indy UDP macht mich noch wahnsinnig
 
Hallo zusammen,
indy 10_5343 (also neuestes build)
Ich hab einen UDPServer
Delphi-Quellcode:
  arUDPServer := TIdUDPServer.create;
  arUDPServer.defaultPort := arPort+1; // ist 'ne konstante
  arUDPServer.BroadcastEnabled := true;
  arUDPServer.onUDPRead := arUDPServerUDPRead;
  arUDPServer.active := true;
Die UDPRead-Prozedur lautet schlicht:
Delphi-Quellcode:
procedure TMainForm.arUDPServerUDPRead (
  AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  infobox (format ('%s hat %s geschrieben.', [aBinding.peerIP, bytesToString (aData)]));
end;
Bleibt zum schluß noch ein
Delphi-Quellcode:
  arUDPServer.Broadcast ('Just a test', arPort+1);
Dieses Programm lasse ich auf zwei rechnern laufen.
Setze ich bei Rechner1 den Broadcast ab, bekommt dieser, da ja der Server auch sendet, seinen eigenen Broadcast, ich kriege also die Messagebox angezeigt, so weit, so gut.
Rechner Nummer 2 bekommt den Broadcast auch, aber zweimal? Hääää?
Bin ich schon bei diesem einfachen Beispiel zu blöd, oder was läuft hier falsch?
Hiiiilfe! ;-)
Nehme ich zum Senden einen UDPClient, passiert das gleiche... Also Rechner 2 bekommt den Broadcast zweimal.
Viele Grüße
Marco

Bambini 25. Feb 2016 16:26

AW: Indy UDP macht mich noch wahnsinnig
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1331367)
Die UDPRead-Prozedur lautet schlicht:
Delphi-Quellcode:
procedure TMainForm.arUDPServerUDPRead (
  AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  infobox (format ('%s hat %s geschrieben.', [aBinding.peerIP, bytesToString (aData)]));
end;

Achtung: das arUDPServerUDPRead() Event wird aus einem Thread gerufen. Hier keine UI Actionen ausführen.

Namenloser 25. Feb 2016 16:27

AW: Indy UDP macht mich noch wahnsinnig
 
Das ist ganz normales Verhalten von UDP.

Nachrichten können
- gar nicht ankommen
- in falscher Reihenfolge ankommen
- mehrfach ankommen

Nimm lieber TCP, wenn du nicht weißt, was du tust. Edit: Okay, habe gerade gesehen, dass es um Broadcasts geht. Dann geht das natürlich nicht.

Sir Rufo 25. Feb 2016 16:34

AW: Indy UDP macht mich noch wahnsinnig
 
Evtl. auch noch diesen Beitrag ansehen
http://www.delphipraxis.net/1209858-post3.html

Marco Steinebach 25. Feb 2016 16:40

AW: Indy UDP macht mich noch wahnsinnig
 
Hallo,
Erstmal vielen Dank!
das UDP ein tolles? Protokoll ist, wußte ich ja schon... meine Güte, ich will doch nur wissen, wer alles da ist, und eine Rückantwort, dann geht's eh mit TCP weiter.
Gibt's da ein Standard-Verfahren, oder muß ich mir ernsthaft alle Nachrichten, mitsamt IP, die der Server bekommt speichern und schauen ob das Nachrichten/IP-Paar schonmal da war, oder was?
Ist das beknackt!
Viele Grüße
Marco

Bambini 25. Feb 2016 16:49

AW: Indy UDP macht mich noch wahnsinnig
 
Ich löse das so, das jeder Client eine eigene GUID (wird beim start des Programmes erzeugt) hat und diese beim Antwortschicken mit sendet. Danach schaut man dann.

Valle 25. Feb 2016 18:28

AW: Indy UDP macht mich noch wahnsinnig
 
Mh, aber eigentlich kann es nicht sein, dass du ständig alles doppelt bekommst. Das muss ein Fehler sein.

(Natürlich stellt UDP nicht sicher, dass es keine Duplikate gibt, aber das heißt ja nicht dass es ständig Duplikate gibt)

Installier dir doch mal Wireshark und mach dich damit vertraut. Ein super Tool um mal zu schauen was tatsächlich im Netz abgeht.

Marco Steinebach 25. Feb 2016 20:39

AW: Indy UDP macht mich noch wahnsinnig
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
den Beitrag von SirRufo schau ich mir gleich an, vielen Dank für den Link.
Aber ich denke, Vallentin hat schon recht, daß kann ja nicht andauernd sein...
Ich hab 'ne bitte:
Angehängt ist ein kleines Projektchen, schlicht der Code von oben. Könnte das mal irgendwer, der zwei Rechner zur Verfügung hat, ausprobieren, ob die Nachrichten auf dem Rechner, der Empfängt, alle doppelt ankommen?
Ich hab, ausnahmsweise, die EXE dringelassen, dann braucht ihr's nicht compilieren.
Ich kann mir beim besten willen nicht vorstellen, daß in den Indy's ein Fehler drin ist, die UDP-Geschichten sind von 2004, gerade ich werde ja nicht der erste sein, dem das auffällt...
Guckt mal jemand rein - bitte?
Viele Grüße
Marco

Marco Steinebach 11. Mär 2016 13:52

AW: Indy UDP macht mich noch wahnsinnig
 
Huhu, will das niemand mal ausprobieren?

BUG 11. Mär 2016 16:11

AW: Indy UDP macht mich noch wahnsinnig
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1331374)
Gibt's da ein Standard-Verfahren, oder muß ich mir ernsthaft alle Nachrichten, mitsamt IP, die der Server bekommt speichern und schauen ob das Nachrichten/IP-Paar schonmal da war, oder was?

Üblicherweise benutzt man eine Sequenznummer anstelle der ganzen Nachricht :wink:
In deinem Fall könnte man z.B. einen Timestamp des Senders nehmen und alle Nachrichten ignorieren, die vor der letzten empfangenen Nachricht gesendet wurden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz