Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   UDP-Multicast Nachricht empfangen (https://www.delphipraxis.net/200527-udp-multicast-nachricht-empfangen.html)

TERWI 28. Apr 2019 17:44

UDP-Multicast Nachricht empfangen
 
Ich möchte gerne eine UDP-Multicast Nachricht empfangen.
Dazu hab ich mir einen IdIPMCastClient auf die From gepackt, den DefaultPort (4713), die Multicastgruppe (233.233.233.233) angegeben und lasse mir im OnIPMCastRead-Event der PeerIP und den Port der ankommenden Nachricht anzeigen.

Senden tue ich das mit PacketReader oder einem ESP8266-WiFiModul
.... da kommt nur nix ?!
Warum nicht ?

Klaus01 28. Apr 2019 20:23

AW: UDP-Multicast Nachricht empfangen
 
.. ist da noch ein Router dazwischen?
Normalerweise lassen die Router per default keinen Multicast traffic durch.

Mit Wireshark hast Du schon geschaut ob traffic ankommt?

Grüße
Klaus

TERWI 29. Apr 2019 07:23

AW: UDP-Multicast Nachricht empfangen
 
Das spielt sich hier alles im Standard-IP-Bereich 192.168.178.x hinter meiner 7490er Box ab.
Ich hab 2 PC's (.55 + .50) und z.Zt. ein Arduino Modul ESP8266 (.40). Es sollen/können mal mehr ESP sein.
Zum Testen benutze ich neben meinem Tool den "PaketSender" auch einen ESP8266 mit selbstgebautem Proggie in C (mit Arduino IDE)
WireShark zeigt mir, das auch entsprechende Uni- wie auch Multicast-Pakete (230.230.230.230 - alle an Port 4711) verschickt werden.
Der ESP empfängt und antwortet auch artig wie befohlen.
Auf PC-Seite ist Unicast kein Problem - das mache ich mit IdUDPClient und IdUDPServer.
Interesaant dabei ist:
IdUDPClient.Broadcast('MULTICAST', 4711, '230.230.230.230');
verschickt anscheinend auch eine Multicastnachricht, die der ESP empfängt und versteht (weil er darauf korrekt antwortet).

Multicast empfangen mit IdIPMCastServer (!) weigert sich bisher weiterhin.

Das Ziel:
Ein oder mehr PC sollen als Server mit 1-x ESP8266-Clienten per UDP kommunizieren.
A) Master soll ein Multicast-Telegramm senden, und alle Clienten sollen eine Unicast-Telegramm als Antwort mit der eigenen IP an den Server senden - ähnlich dem Windows Discovery / Ping. Nur einfacher.
B) Unicast's vom Server an einzelne Clienten, um diese zu steuern und deren Antwort zu erhalten.
C) Clienten sollen dem Server je nach UDB-Typ (Multi/Uni) antworten.
D) Clienten sollen selbst ein Multicast an den/Die Server senden, falls ein Event auftritt, sich diese an- oder abmelden (Hall, bin der neue / wieder da ... und Tschüss)

generic 29. Apr 2019 07:32

AW: UDP-Multicast Nachricht empfangen
 
Sind da noch Switche involviert?

ggf. musst du per IGMP den Switch/Router davon überzeugen, dass du das Multicast haben willst.

TERWI 29. Apr 2019 07:37

AW: UDP-Multicast Nachricht empfangen
 
Nein - hier steht nur eine Fritz-Box 7490 und da hängt alles per Draht oder Funk dran.

Der ESP versteht es ja, wenn ich vom PC sende.
Der PC aber nicht, wenn der ESP oder ein anderer PC ein Muticast sendet.
Es ist anscheinend also die Empfangsroutine, die streikt.

HolgerX 29. Apr 2019 09:34

AW: UDP-Multicast Nachricht empfangen
 
Hmm..

Pakete verschicken geht...

Zeigt den WireShark auch eingehende Pakete auf dem PC an?
Wenn nicht könnte hier die Firewall diese (eingehenden) blockieren..

TERWI 29. Apr 2019 12:09

AW: UDP-Multicast Nachricht empfangen
 
... ich bin da nicht so der Held beim Wireshark - aber ich sehe die (UDP) pakete die abgehen.
D.h., wenn ich hier am PC vom PaketSender ein MC an 230.230.230.230 verschicke ebenso das Antwortpaket vom ESP.
Dito vom PC / mein Delphi Tool, wenn ich (vermeintlich) Multicast oder Unicast sende.
Das Tool empfängt auch auch wenn es direkt an die IP geht - aber ein Multicast kommt da nicht an ?!
Denke mal, das da die Firewall nix blockt. Hab mal beim Kaspersky reingeguckt, das ist nix entsprechendes blockiert.

Ist das irgendwie eine Feinheit im Setup des IdIPMCastClient ?

HolgerX 29. Apr 2019 15:03

AW: UDP-Multicast Nachricht empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..

Anbei mal etwas zusammengeklimpert, konnte es aber nicht bei mir testen.
Habe ein anderes Beispiel dafür verwendet..

(Delphi 6 mit Indy 10.6)

Und was hat Kaspersky mit der Windows-Firewall zu tun?
Gebe dort mal den Port 4713 für UDP als 'Eingehend' frei..

TERWI 29. Apr 2019 17:33

AW: UDP-Multicast Nachricht empfangen
 
Jetzt hab ich den Salat .....

Mit deinem Tool funzt das, nachdem ich die Ports 4710-4720 freigegeben.
Mit meinem immer noch nicht grrrrr.....
Du schrubtest Indy 10.6 - bei mir zeigts die Version 10.2.5. Ist wohl die org. Inst mit Delphi 2009 mit Dateien von 2008.
Möglicherweise ein Versions-Problem ?! Also mal die neueste drauf mache .... hatte ich mir gedacht.

Eine Version Indy10_5498 mit Datum von gestern gezogen, in Delphi alles nach Anleitung gelöscht und die FullD120.bat probiert.
Denkste ! Das CMD endet mit einer kilometerlangen Liste von (Fehler-) Meldungen. Wass nu wieder los ?
Ich hatte das vor Jahren schon mal - aber die Lösung des Drama's weiß ich nicht mehr.
Liegts am Win 8 mit seinen Rechteproblemen oder eas ist das ???

HolgerX 30. Apr 2019 04:17

AW: UDP-Multicast Nachricht empfangen
 
Hmm..

ich habe Indy 10 unter Delphi 6 (hat selber nur 9) gar nicht installiert, sondern einfach nur entpackt und die Verzeichnisse in den Suchverzeichnissen des Projektes hinterlegt.
So kann ich Indy 10 ohne Inst verwenden...

haentschman 30. Apr 2019 06:18

AW: UDP-Multicast Nachricht empfangen
 
Moin...8-)
[OT]
Zitat:

Delphi 6
Ist das ein Schreibfehler? :shock: :wink: Selbst für asbach uralte Programme die noch in Pflege sind, ist doch der Standard D7...oder? Für privat macht es überhaupt keinen Sinn D6 zu verwenden. :roll:
[/OT]

HolgerX 30. Apr 2019 08:10

AW: UDP-Multicast Nachricht empfangen
 
Hmm...

[OT]

Zitat:

Zitat von haentschman (Beitrag 1431323)
Moin...8-)
[OT]
Zitat:

Delphi 6
Ist das ein Schreibfehler? :shock: :wink: Selbst für asbach uralte Programme die noch in Pflege sind, ist doch der Standard D7...oder? Für privat macht es überhaupt keinen Sinn D6 zu verwenden. :roll:
[/OT]

Ganz recht DELPHI 6!

Damit kann ich bisher alles machen, was ich brauchte.
Ohne immer wieder Geld auszugeben für neue Versionen!
Ohne Online-Zwang!
Ohne dicke, fette EXE (ohne Mehrwert) zu erstellen!
...

Und bitte jetzt NICHT SCHON WIEDER das Rumgebasche auf die alte Version und das ich UNBEDINGT auf die neueste 10x Community Edition hochgehen soll...

Ich nutze D6 mit allen Möglichkeiten, welche damals noch die Professional geboten hat! (Incl. Datenbankanbindungen)
Und nein ich habe noch nichts vermisst!

[/OT]

TERWI 30. Apr 2019 15:39

AW: UDP-Multicast Nachricht empfangen
 
Ein Mega-Paket DelphiWebThankYouBitCoins an HolgerX 8-)
Ich habe auch eine Ewigkeit mit D7 auf Win98 rumgemacht und bin gut damit ausgekommen.
Wenn mann nicht zwingend irgendwelches neues API-Gedöns braucht, ist ein Umstieg auch nicht zwingend nötig - bei mir leider ja...
So viel zum OT.

Zwischenbericht:
@HolgerX, es hat hier wie gesagt gefunzt.
Ich teste hier grad noch rum und zeitnah meine Ergebnisse kund.
So viel sei schon mal gesagt: Ich hab hier nun die aktuelle Indy 10.6.2.5498 von vorgestern am Start - da hat sich offensichtlich einiges zur org. Delphi-Inst aus 2008 geändert, was ich erst mal umsetzen und testen muss.

EDIT- ÜBRIGENDS:
Da Indy10 sicht nicht "automatisch per Fullxxx.bat installieren ließ und ich auch keine gescheite Lösung im WWW dazu gefunden habe, hab ich's eben manuell gemacht - was dann auch gefunzt hat. Heureka !
Dummerweise hatte ich nach einem viel späteren Windoof-Restart plötzlich keinen Desktop mehr ...
DRAMA - KRISE ! Egal, auch (relativ einfach) gelöst und alles betreff Indy u. a. noch mal von vorne.

EWeiss 30. Apr 2019 15:47

AW: UDP-Multicast Nachricht empfangen
 
Zitat:

Damit kann ich bisher alles machen, was ich brauchte.
Ohne immer wieder Geld auszugeben für neue Versionen!
Ohne Online-Zwang!
Ohne dicke, fette EXE (ohne Mehrwert) zu erstellen!
:thumb::thumb::firejump:

gruss

TERWI 30. Apr 2019 15:57

AW: UDP-Multicast Nachricht empfangen
 
Ich hab mittlerweile festgestellt, dass der IdIPMCastClient sowohl UniCast als auch MultiCast empfängt.
Schon sehr schön - KOMMA ABER:

ABinding liefert nur Daten zum Absender (dessen IP, Port) zurück - aber nicht eine mögliche MultiCast-IP, mit der man dann in der Empfangsroutine auswerten könnte, ob es sich um Multi- oder UniCast-Anruf handelt.

Oder gibt's da noch nen Trick via übermitteltem Socket ?

TERWI 30. Apr 2019 17:15

AW: UDP-Multicast Nachricht empfangen
 
Weitere Erkentnisse:
Es werden offensichtlich lokal (am selben Rechner) nur abgesendete Pakete an '127.0.0.1' erkannt.

D.h. senden von -> an die eigene IP mittels PacketSender als Multi- oder UniCast wird nicht erkannt ?!

Von externen PCs/ESP-Modulen klappt das hier allerdings wie erwähnt prima.

generic 2. Mai 2019 07:24

AW: UDP-Multicast Nachricht empfangen
 
Zitat:

Zitat von TERWI (Beitrag 1431387)
Weitere Erkentnisse:
Es werden offensichtlich lokal (am selben Rechner) nur abgesendete Pakete an '127.0.0.1' erkannt.

D.h. senden von -> an die eigene IP mittels PacketSender als Multi- oder UniCast wird nicht erkannt ?!

Von externen PCs/ESP-Modulen klappt das hier allerdings wie erwähnt prima.

Hast du mehrere Programme auf *einen* PC laufen, die das Multicast empfangen sollen?
Das Paket kommt nur einmal an die Netzwerkkarte. Somit kann auch nur eine Software das Paket empfangen.
Bei meiner Software BOMAC löse ich, dass Problem indem ich mich auf mehrere IPs binde, welche natürlich an der Netzwerkkarte eingestellt sein müssen. Allerdings sind das bei mir Broadcast-Pakete.

HolgerX 2. Mai 2019 11:53

AW: UDP-Multicast Nachricht empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmmm..

Zitat:

Zitat von generic (Beitrag 1431429)
Hast du mehrere Programme auf *einen* PC laufen, die das Multicast empfangen sollen?
Das Paket kommt nur einmal an die Netzwerkkarte. Somit kann auch nur eine Software das Paket empfangen.
Bei meiner Software BOMAC löse ich, dass Problem indem ich mich auf mehrere IPs binde, welche natürlich an der Netzwerkkarte eingestellt sein müssen. Allerdings sind das bei mir Broadcast-Pakete.

Deshalb verwendet er ja Multicast und nicht UniCast (UDP), da sich hierdurch alle Clienttools mit TIdIPMCastClient den Port teilen und das Paket an allen ankommt!

Die Bindung an einen Empfänger ist durch setzen eines Parameters auf dem Socket aufgehoben, deshalb auch Multicast... ;)

Anbei mein überarbeitetes Test-Tool.

Starte es mehrfach (+ Start Button) und Du kannst an allen gleichzeitig die Broadcast-Message empfangen..

TERWI 2. Mai 2019 15:38

AW: UDP-Multicast Nachricht empfangen
 
Ich bin da mittlerweile auch etwas weitergekommen.
Zum empfangen von Uni- und MultiCast hab ich einen IdIPMCastClient (als Empfänger) und einen IdUDPClient (als Sender) auf die Form gebappt.
Im Objektinspektor jeweils dazu nichts geändert. Erforderliche Einstellungen dazu setze ich in der Form.OnCreate und zur Laufzeit.
Delphi-Quellcode:
  // Vorgaben setzen
  IdIPMCastClient.ReuseSocket   := rstrue;
  IdUDPClient.ReuseSocket       := rstrue;
  cbb_MCGROUPChange(self); // set MultiCast-IP
  cbb_IPChange(self);      // set tx_ip and tx_multi
  cbb_PortChange(self);    // set tx_port
  // RX - IP's binden
  cb_BINDINGS.Clear;
  cb_BINDINGS.Items.Add(IP_loc);
  IdIPMCastClient.Bindings.clear;
  IdIPMCastClient.Bindings.Add.IP := IP_loc;
  IPlist := TStringList.Create;
  try
    GStack.AddLocalAddressesToList(IPlist);
    for I := 1 to IPlist.Count do
    begin
      IdIPMCastClient.Bindings.Add.IP := IPlist[i - 1];
      cb_BINDINGS.Items.Add(IPlist[i - 1]);
    end;
  finally
    IPlist.Free;
  end;
  if(cb_BINDINGS.Items.Count > 0) then cb_BINDINGS.ItemIndex := 0;
  IdIPMCastClient.Active        := true;
  IdUDPClient.Active            := true;
Das funzt prima soweit - auch mit gleicher IP im Sender/Empfänger.
Erstaunlicherweise empfängt der IdIPMCastClient auch Uni- und Broadcast und der IdUDPClient sendet alle Cast-Typen.
Wozu gibt es denn dann noch den IdIPMCastServer und den IdUDPServer ?

Ein kleines Problem hab ich noch:
Beim ESP8266 gibt es eine Funktion Udp.remoteIP(), welche mir die Absender-IP gibt (wie bei Indy die ABinding.PeerIP) und eine Funktion Udp.destinationIP(), welche mir zusätzlich noch das ursprüngliche Ziel angibt (also ob es eine Uni- Broad- oder Multicast-IP war).

Letzteres fehlt mir beim Indy. Das wäre auch auf dem PC sehr hilfreich zu wissen / zu unterscheiden, wohin der Call eigentlich ging.
Ich find dazu nix im WWW. Jemand ne Idee, wie man sich sowas ggf. separat basteln kann, falls Indy das nicht schon irgendwo bereithält ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 Uhr.

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