我正在编写一个程序,使用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开始,看看它在哪里。
非常感谢任何帮助!
答案 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)