使用Indy10,UDP服务器返回响应由不同的IP

问题描述 投票:0回答:1

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;

是有解决方案,还是我必须发送IP地址以绑定到原始文本消息中?
    

显示的代码很好。 但是,如果您的服务器仅对
delphi udp indy indy10
1个回答
0
投票
有一个

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;
...


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.