在Arduino以太网上设置传出UDP数据报的IP数据包的生存时间(TTL)

时间:2012-12-29 11:56:22

标签: header udp ip arduino ttl

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

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

我的问题是我需要自定义传出UDP / IP数据包的TTL,但Udp.beginUdp.beginPacketUdp.writeUdp.endPacket都不提供参数设置这样的选择。

我知道TTL字段属于IP header,但您似乎无法使用Arduino的Ethernet / socket / w5100库处理原始IP数据包。

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

有人知道是否有某种高级设施可以设置数据包的TTL,还是应该更深入地了解数据库以实现这一目标?

1 个答案:

答案 0 :(得分:2)

最后我找到了解决方案。 WIZnet W5100插槽提供了描述套接字行为的寄存器,如文档here所示。其中一个寄存器是Socket 0 IP TTL (S0_TTL)(地址0x0416)。我看到这些寄存器是用startUDP函数(在socket.cpp中)编写的,以便设置套接字的目标IP地址和端口:

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

所以我在那里附加了对

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

确实有效,即草图已编译完成。这种方法没有记录,我想到了其他注册编写方法,并在网上找到了一些使用它的项目。

我还写了this patch来为Arduino 1.0.1 - 2012.05.21附带的以太网库提供覆盖Udp.beginPacket(remoteIP, remotePort, ttl)