2014-03-28 78 views
0

我正在寫一個程序發送/接收數據到使用IPv6 UDP端口的設備。我的python代碼運行在Win7平臺上,該設備是一個定製硬件。 PC和設備直接連接,不能通過局域網路由。無法發送數據到UDP IPv6套接字,直到我ping

程序工作...有點。當我最初嘗試向設備發送消息時,發送失敗。更具體地說,正如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作爲開始看到哪裏需要我。

任何援助將不勝感激!

+0

聽起來像是某種省電問題,我...,直到它收到一些交通設備可能會進入省電模式(也許只有網卡)的。這是否只發生在IPv6或IPv4上? – Unknown

回答

1

一些周圍挖掘後,我相信,我發現我的問題。我沒有在我的綁定語句中包含運行python的PC的IP地址。所以改變我的連接()功能

def connect(self): 
    # ... 
    client.bind(('fe80::', port)) 
    # ... 

允許我的消息一致發送。我對套接字編程很新,所以任何人都可以提供解釋爲什麼這個修復工作?

感謝

0

夫婦的提示:

  • 呼叫client.setsockopt()你打電話之前client.bind()

  • 當您完成套接字時,您需要致電socket.close()

  • 我懷疑是ping和計時問題的奇怪問題背後的原因可能是低超時值和NDP緩存的組合。 0.25的超時可能是由於某種原因,NDP resolution +數據傳輸完成(可能是您的嵌入式設備堆棧較慢)太低。當您執行ping操作時,它會爲您執行NDP,並創建可從您的應用使用的緩存信息,而不會中斷超時限制。

    我建議嘗試了極限:client.settimeout(2)

+0

勞倫斯,感謝您的建議。我添加了所有更改,但沒有任何區別。另一點,如果數據添加到討論。有時反覆嘗試在幾秒鐘內發送消息會迫使他們實際發送。但是,我只看到這一兩次,只有在我收到ping響應之後。 –

相關問題