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 ?