AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke UDP-Multicast Nachricht empfangen
Thema durchsuchen
Ansicht
Themen-Optionen

UDP-Multicast Nachricht empfangen

Ein Thema von TERWI · begonnen am 28. Apr 2019 · letzter Beitrag vom 2. Mai 2019
Antwort Antwort
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: UDP-Multicast Nachricht empfangen

  Alt 30. Apr 2019, 15:57
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: UDP-Multicast Nachricht empfangen

  Alt 30. Apr 2019, 17:15
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.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#3

AW: UDP-Multicast Nachricht empfangen

  Alt 2. Mai 2019, 07:24
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.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#4

AW: UDP-Multicast Nachricht empfangen

  Alt 2. Mai 2019, 11:53
Hmmm..

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..
Angehängte Dateien
Dateityp: zip Test_INDY_Multicast.zip (1,79 MB, 18x aufgerufen)
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: UDP-Multicast Nachricht empfangen

  Alt 2. Mai 2019, 15:38
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 ?

Geändert von TERWI ( 2. Mai 2019 um 15:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 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