在ping之前,无法将数据发送到UDP IPv6套接字

时间:2014-03-28 14:02:40

标签: python sockets udp ping ipv6

我正在编写一个程序,使用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开始,看看它在哪里。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

经过一番挖掘后,我相信我发现了自己的问题。我没有在我的绑定语句中包含运行python的PC的IP地址。所以将上面的connect()函数更改为

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

允许我的邮件一致地发送。我对套接字编程很新,所以有人能解释为什么这个修复工作正常吗?

由于

答案 1 :(得分:0)

一些提示:

  • 在致电client.setsockopt()之前致电client.bind()

  • 完成套接字后,您需要致电socket.close()

  • 我怀疑是ping和计时问题的奇怪问题背后的原因可能是低超时值和NDP缓存的组合。 0.25的超时可能由于某种原因而导致NDP resolution +数据传输无法完成(可能您的嵌入式设备堆栈很慢)。执行ping操作时,它会为您执行NDP操作,并创建可在应用程序中使用的缓存信息,而不会超出超时限制。

    我建议尝试提升限额:client.settimeout(2)