Indy10中UDP服务器用非目标IP返回响应的原因及解决方案咨询
UDP双IP服务器响应IP不符问题分析与解决
问题根源
服务器有多个IPv4地址时,TIdUDPServer默认绑定0.0.0.0(即监听所有可用网络接口)。当通过ABinding.SendTo发送响应时,操作系统会根据自身路由表自动选择出口IP,这个IP不一定是客户端请求发送到的那个服务器IP——简单说,接收请求的是监听的接口,但发送响应走的是系统默认路由的出口,所以出现了响应IP不符的情况。
代码问题修正
先纠正客户端代码里的明显笔误:
UDPClient.Host := '目标服务器IPv4地址'; UDPClient.Port := 9999; // 原代码写的是UDPClient.IP := 9999,这是错误的,Port才是端口属性 UDPClient.Send('Hello'); Memo2.Text := UDPClient.ReceiveString(3000);
解决方案(无需在消息中指定IP)
有两种可靠的解决方式,根据需求选择:
1. 固定服务器响应IP
如果需要服务器始终用某个特定IP发送响应,直接让TIdUDPServer绑定到该IP,而非默认的0.0.0.0:
UDPServer.Bindings.Clear; with UDPServer.Bindings.Add do begin IP := '你指定的响应IPv4地址'; Port := 9999; end; UDPServer.Active := True;
这样服务器只会监听指定IP,响应时自然从该IP发出。
2. 按请求IP对应响应
如果需要服务器同时监听多个IP,且每个请求都用客户端发送的目标IP来响应,给每个服务器IP单独添加绑定:
UDPServer.Bindings.Clear; // 添加第一个IP绑定 with UDPServer.Bindings.Add do begin IP := '服务器IPv4地址1'; Port := 9999; end; // 添加第二个IP绑定 with UDPServer.Bindings.Add do begin IP := '服务器IPv4地址2'; Port := 9999; end; UDPServer.Active := True;
此时客户端发送到哪个IP,对应的绑定句柄就会处理请求,用该IP发送响应,完全匹配客户端的请求目标。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

