Dann kommst Du um einen UDP-Server nicht herum, welcher auf einen festen Port (z.B. 8889) lauscht!
Nur bei
TCP kannst du auf eine eingehende Connection über dessen Port antworten (bis die Connection getrennt wird).
Das stimmt nicht. Hole Punching (Firewall), Antworten usw. funktioniert auch problemlos mit UDP. Das sollte so direkt funktionieren:
Delphi-Quellcode:
// Server:
UDPServer.DefaultPort := 9999;
UDPServer.Active := True;
UDPServer.OnUDPRead := UDPServerUDPRead;
procedure TFormExample.UDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, 'Test');
end;
// Client:
var
UdpClient: TIdUDPClient;
ReceivedData: string;
begin
UdpClient := TIdUDPClient.Create(nil);
try
UdpClient.Host := '127.0.0.1';
UdpClient.Port := 9999;
UdpClient.Active := True;
UdpClient.Send('Hallo Welt');
ReceivedData := UdpClient.ReceiveString(5000);
if ReceivedData <> '' then
ShowMessage('Antwort: ' + ReceivedData)
else
ShowMessage('Keine Antwort erhalten.');
finally
UdpClient.Free;
end;
end;
Da der Client kein Empfangsevent hat, bietet es sich an, einen Thread zu verwenden.