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

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,还是必须深入库中实现?

1个回答

3
最终我找到了一个解决方案。WIZnet W5100插座提供了描述插座行为的寄存器,如W5100数据手册版本1.1.6所述。其中一个寄存器是Socket 0 IP TTL (S0_TTL)(地址0x0416)。我发现这些寄存器在socket.cpp中的startUDP函数中被写入,以设置插座的目标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附带的以太网库。


只是好奇,你还记得默认的TTL是多少吗?我遇到一些网络设备的问题,它们可以正常接收数据包,但除非我在同一个子网上,否则我无法获得回复,即使中间交换机的配置是正确的。 - snicker
W5100中的默认TTL为128。 - Roman Elizarov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接