You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EIPScanner库对接多台TURCK I/O模块时首个UDP连接超时

问题根因分析

你遇到的是EtherNet/IP Class 1 IO通信的典型端口冲突问题:

  • EtherNet/IP协议规定默认的IO数据目的端口为2222,两个从站返回的UDP报文目的端口默认都是2222
  • 你当前的修改没有给每个IO连接的UDP套接字指定独立的本地监听端口,两个套接字都绑定到了0.0.0.0:2222,开启端口复用后系统会把收到的2222端口报文随机分发给其中一个套接字,导致第一个模块的报文被第二个套接字抢走,出现超时。

从你提供的日志也能验证这个问题:

[DEBUG] Received data from connection T2O_ID=1911881729(host: 192.168.1.130:2223)
[DEBUG] Received data from connection T2O_ID=915406849(host: 192.168.1.131:2224)

两个从站的报文出现了交叉接收的情况,正好符合端口复用后报文随机分发的特征。

排查与解决步骤
  • 给每个IO连接分配独立的本地监听端口
    实例化第二个模块驱动前,主动指定不同的本地端口(比如第一个用2222,第二个用2223,依次类推),需要修改ConnectionManager的forwardOpen逻辑,创建UDPSocket后补充绑定逻辑,绑定到你指定的本地端口:
    ioConnection->_socket = std::make_unique<UDPSocket>(endPoint);
    // 新增:绑定到为当前连接独立分配的本地端口
    EndPoint localEndPoint("0.0.0.0", localPort);
    ioConnection->_socket->bind(localEndPoint);
    
  • 修改ForwardOpen请求的对应端口字段
    发送ForwardOpen请求时,把你分配的本地监听端口填入O->T TUNNELING ENDPOINT字段里,告知从站把IO数据发到你指定的这个独立端口,而不是默认的2222,这样两个从站的报文就会发到不同的本地端口,不会出现冲突。
  • 补充报文源地址校验
    接收报文时除了校验T2O_ID,还要校验报文的源IP是否和当前连接的从站IP一致,避免其他从站的报文被错误匹配到当前连接。
  • 调整超时配置(可选)
    你之前注释的超时配置参数太小,1微秒的超时根本收不到正常报文,建议调整为tv.tv_sec = 1; tv.tv_usec = 0;即1秒超时,配合丢包统计逻辑使用。
验证方法

修改完成后运行程序,查看日志中两个UDP套接字绑定的本地端口是否不同,同时检查两个从站返回的报文是否只会被对应套接字接收,没有交叉接收的情况即可。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 09:36:06