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

2024-09-30 01:29:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个程序,用ipv6udp端口向设备发送/接收数据。我的python代码运行在Win7平台上,设备是一个定制的硬件。PC和设备直接连接,不通过LAN进行路由。在

程序工作。。。某种程度上。当我最初尝试向设备发送消息时,发送失败。更具体地说,就像wireshark看到的那样,我从来没有看到消息被发送到设备上。当我在命令行上使用ping <ipv6_addr> -tping设备时,前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)

一些google并没有提供任何关于问题是Python还是其他问题的好线索,所以我想我应该从Python开始,看看它会把我带到哪里。在

如有任何帮助,我们将不胜感激!在


Tags: 程序clientsend消息databinportdef
2条回答

经过一番周折,我相信我发现了我的问题。我没有在bind语句中包含运行python的PC的IP地址。所以将上面的connect()函数改为

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

允许我的信息发送一致。我对socket编程还很陌生,所以有人能解释一下为什么这个修复会起作用吗?在

谢谢

几点提示:

  • 在调用client.bind()之前先调用client.setsockopt()

  • 完成套接字操作后,需要调用socket.close()

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

    我建议尽量提高限额:client.settimeout(2)

相关问题 更多 >

    热门问题