我正在使用 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 的以太网/套接字/w5100 库处理原始 IP 数据包。
我查看了上述函数的定义,特别是在 EthernetUDP::beginPacket
中,我想在传递消息的有效负载之前找到有用的东西,但我得到了卡住了,因为它只包含对 startUDP()
(socket.cpp) 的调用,后者处理我不清楚的 W5100 类的方法。
有人知道是否有某种高级工具可以设置数据包的 TTL,或者应该更深入地研究库来实现这一点?
最佳答案
终于找到解决办法了。 WIZnet W5100 套接字提供描述套接字行为的寄存器,如 W5100 Datasheet Version 1.1.6 中所述。 .其中一个寄存器是 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)
。
关于header - 为 Arduino 以太网上传出的 UDP 数据报设置 IP 数据包的生存时间 (TTL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14081407/