簡體   English   中英

在我ping之前無法將數據發送到UDP IPv6套接字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM