2014-03-28 114 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响应之后。 –

相关问题