You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Delphi 12.3 Indy多网卡环境下UDP广播失败问题排查

问题分析与解决方案

核心代码问题

你的代码没有为每个TIdUDPClient实例绑定对应的本地网卡IP,Indy的TIdUDPClient默认会使用系统默认路由网卡发送UDP包——哪怕你指定了不同子网的广播地址,实际数据包还是会从默认网卡发出,导致其他子网的工业设备收不到查询请求。

修正后的代码示例

在创建TIdUDPClient后,需要显式绑定当前循环的本地网卡IP,确保广播包从对应网卡发出:

//... 
GetIPAddresses(IPList);  

//BroadcastAddress() gets the subnet broadcast IP from a given IP 
for S in IPList do begin   
  with TIdUDPClient.Create(nil) do try     
    BroadcastEnabled := True;     
    // 绑定当前网卡的本地IP,端口设为0让系统自动分配
    Binding.Bindings.Add.IP := S;
    Binding.Bindings.Add.Port := 0;
    Broadcast('$1'+S, 11864, BroadcastAddress(S), IndyTextEncoding_8bit);   
  finally     
    Free;   
  end;   
  Sleep(100); 
end;  

// 全局广播建议绑定0.0.0.0,确保数据包能从所有网卡发出
with TIdUDPClient.Create(nil) do try   
  BroadcastEnabled := True;   
  Binding.Bindings.Add.IP := '0.0.0.0';
  Binding.Bindings.Add.Port := 0;
  // 这里用IPList的第一个元素或任意有效IP填充即可
  Broadcast('$1'+IPList[0], 11864, '255.255.255.255', IndyTextEncoding_8bit); 
finally   
  Free; 
end; 
//...  

额外检查项

  • 验证BroadcastAddress()函数逻辑:确认它能根据本地IP和子网掩码正确生成子网广播IP(将主机位全部置1),若函数逻辑错误,会导致广播包无法到达目标子网。
  • 检查系统路由表:确保每个网卡对应的子网都有独立的路由条目,避免系统强制将数据包转发到默认网卡。
  • 排查防火墙规则:确认本地防火墙允许UDP 11864端口的出站广播,以及UDP 11865端口的入站响应。

内容的提问来源于stack exchange,提问作者SteveS

火山引擎 最新活动