i终于今天解决了为什么简单的UDP客户端/服务器文本通信到服务器会产生错误。服务器有2个IPv4地址。 我正在发送到一个IP地址之一,而Tidudpserver正在向另一个IP地址发送回! 这让我度过了一周的困难。
为什么udpserver绑定到错误的IP地址以发送响应?准代码
UDPClient.Host := 'an IPv4 address';
UDPClient.IP := 9999;
UDPClient.Send('Hello');
Memo2.Text := UDPClient.ReceiveString(3000);
服务器代码
UDPServer.DefaultPort := 9999;
UDPServer.Active := True;
procedure TForm1.UDPServerUDPRead(AThread: TIdUDPListenerThread;
AData: TIdBytes; ABinding: TIdSocketHandle);
begin
Memo1.text := BytesToString(AData);
ABinding.SendTo(ABinding.PeerIP,ABinding.PeerPort,'Received: '+Memo1.Text);
end;
显示的代码很好。 但是,如果您的服务器仅对
0.0.0.0
,那么它将在所有本地IPv4接口上侦听,然后您在OS的路由表中的摆布,有关它决定使用哪种接口,以将其用于发送带有的界面。如果选择错误的接口,请尝试单独为每个本地IP创建一个单独的
Binding
(您可以使用
GIdStack.GetLocalAddressList()
来获取IPS),例如:
var
list: TIdStackLocalAddressList;
i: Integer;
...
UDPServer.Active := False;
UDPServer.Bindings.Clear;
UDPServer.DefaultPort := 9999;
list := TIdStackLocalAddressList.Create;
try
GIdStack.GetLocalAddressList(list);
for i := 0 to list.Count-1 do
UDPServer.Bindings.Add.SetBinding(list[i].IPAddress, UDPServer.DefaultPort, list[i].IPVersion);
finally
list.Free;
end;
UDPServer.Active := True;
...