3

我正在使用 Arduino 以太网将 UDP 数据报发送到远程主机。我用来发送单个数据报的代码是:

Udp.begin(localPort);
...
Udp.beginPacket(remoteIP, remotePort);
Udp.write(data);
Udp.endPacket();

我的问题是我需要自定义传出 UDP/IP 数据包的 TTL,但是Udp.beginUdp.beginPacketUdp.writeUdp.endPacket都没有提供参数来设置此类选项。

我知道 TTL 字段属于IP 标头,但您似乎没有使用 Arduino 的以太网/套接字/w5100 库处理原始 IP 数据包。

我查看了上述函数的定义,特别是EthernetUDP::beginPacket在我想在传递消息的有效负载之前找到有用的东西,但我被卡住了,因为它只包含对startUDP()(socket. cpp),后者处理我不清楚的 W5100 类的方法。

有人知道是否有某种高级工具来设置数据包的 TTL,还是应该更深入地研究库来实现这一点?

4

1 回答 1

3

最后我找到了解决方案。WIZnet W5100 插座提供描述插座行为的寄存器,如W5100 数据表版本 1.1.6中所述。这些寄存器之一是Socket 0 IP TTL (S0_TTL)(地址0x0416)。我看到这些寄存器被写入startUDP函数 (in socket.cpp) 以设置套接字的目标 IP 地址和端口:

W5100.writeSnDIPR(s, addr);
W5100.writeSnDPORT(s, port);

所以我在那儿附加了一个电话

W5100.writeSnTTL(s, (uint8_t) 255); // set TTL to 255

它确实有效,即草图已编译。这种方法没有记录,我通过查看其他寄存器写入方法并在网上找到了几个使用它的项目来发现它。

我还编写了这个补丁Udp.beginPacket(remoteIP, remotePort, ttl)来提供对Arduino 1.0.1 - 2012.05.21 附带的以太网库的覆盖。

于 2012-12-29T13:41:16.933 回答