我正在使用Arduino以太网将UDP数据报发送到远程主机。我用来发送单个数据报的代码是:
Udp.begin(localPort);
...
Udp.beginPacket(remoteIP, remotePort);
Udp.write(data);
Udp.endPacket();
我的问题是我需要自定义传出UDP / IP数据包的TTL,但Udp.begin,Udp.beginPacket,Udp.write和Udp.endPacket都不提供参数设置这样的选择。
我知道TTL字段属于IP header,但您似乎无法使用Arduino的Ethernet / socket / w5100库处理原始IP数据包。
我查看了上述函数的定义,特别是在EthernetUDP::beginPacket
中我想知道在我传递消息的有效负载之前发现它有用的东西,但是因为它包含的不多而我被卡住了不只是对startUDP()
(socket.cpp)的调用,后者处理W5100类的方法,我不清楚。
有人知道是否有某种高级设施可以设置数据包的TTL,还是应该更深入地了解数据库以实现这一目标?
答案 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)
。