2012-12-29 177 views
2

的時候我使用一個Arduino以太網UDP數據報發送到遠程主機。我用它來發送一個數據包的代碼是:設置IP數據包的生存期(TTL)傳出UDP數據報上的Arduino以太網

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看着上面函數的定義,expecially在這裏我想知道找到一些有用的東西是叫就在我傳遞消息的有效載荷,但我卡住了,因爲它包含了比一個多不了多少調用startUDP()(socket.cpp),後者處理W5100類的方法,這些方法對我來說不是很清楚。

難道有人知道,如果有一個莫名其妙的高級設備設置數據包的TTL,還是應該去深入到圖書館來實現呢?

回答

2

最後我找到了解決方案。 WIZnet W5100套接字提供描述套接字行爲的寄存器,記錄爲here。其中一個寄存器是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 

它確實起作用了,即草圖被編輯。這種方法沒有記錄,我想到了看其他註冊編寫方法,並在網上找到了一些利用它的項目。

我也寫了this patch爲覆蓋Arduino 1.0.1 - 2012.05.21的以太網庫提供覆蓋Udp.beginPacket(remoteIP, remotePort, ttl)

+0

只是好奇,你還記得默認TTL是什麼?我遇到了一些接收數據包的網絡設備的問題,但我無法獲得答覆,除非我在同一子網上,即使在中間交換機上進行了適當的配置。 – snicker

+0

W5100中的默認TTL爲128。 –