[英]Not able to send data to a UDP IPv6 socket until I ping
我正在編寫一個程序,以使用IPv6 UDP端口向設備發送/接收數據。 我的python代碼在Win7平台上運行,並且該設備是一塊自定義硬件。 PC和設備直接連接,沒有通過LAN路由。
該程序工作正常。 當我最初嘗試向設備發送消息時,發送失敗。 更具體地說,從wireshark的角度來看,我從沒看到消息發送到設備。 當我在命令行上使用ping <ipv6_addr> -t
ping設備時,前1或2次嘗試失敗,此后,便開始接收ping。 我殺死了ping並嘗試像以前一樣發送消息,但是現在成功了。 Wireshark現在顯示所有消息。 如果我在相對較短的時間內(大約10秒到2分鍾之間)發送消息,則該程序將按預期運行。 如果我等待更長的時間,則不會再次發送我的消息。 如果我使ping程序連續ping,無論消息發送活動之間的時間間隔如何,我的消息也會被發送。 這是我的代碼:
import socket
def connect(port):
if socket.has_ipv6:
client = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
client.bind(('', port))
client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
client.settimeout(0.25)
def send_data(addr, port, data):
client.sendto(data, (addr, port))
def main_app():
connect(10000)
bin_data = binascii.a2b_hex('deadbeef')
# Do some processing
send_data(<ipv6_address>, 10000, bin_data)
關於問題是Python還是其他問題,一些谷歌搜索並沒有產生任何好的線索,因此我認為我將從Python開始着手,以了解問題所在。
任何幫助將不勝感激!
經過一番挖掘,我相信我找到了問題。 我沒有在我的bind語句中包含運行python的PC的IP地址。 因此,將我上面的connect()函數更改為
def connect(self):
# ...
client.bind(('fe80::', port))
# ...
允許我的郵件始終發送。 對於套接字編程來說,我還很陌生,所以誰能提供一個解釋為什么此修復程序有效的解釋?
謝謝
幾個提示:
呼叫client.setsockopt()
調用之前client.bind()
完成套接字后,需要調用socket.close()
。
我懷疑是ping和時序問題怪異問題背后的原因可能是低超時值和NDP緩存的結合。 0.25
的超時可能出於某種原因,對於NDP分辨率 +數據傳輸無法完成太低(也許嵌入式設備堆棧很慢)。 執行ping操作時,它會為您執行NDP,並創建可在您的應用程序中使用的緩存信息,而不會超出超時限制。
我建議嘗試提高限制: client.settimeout(2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.