我对目的地ip有2个UDP响应,一个接着一个:
sendsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sendsock.bind(('%s' % ip_adr, 1036))
#send first packet
ok_response = "Reception Success, more to come"
str2bytes = bytes(ok_response,'utf-8')
sendsock.sendto(str2bytes, ("%s" % phone.ip_addr, int(phone.sip_port)))
#send second packet
ok_response = "Fun data here"
str2bytes = bytes(ok_response,'utf-8')
sendsock.sendto(str2bytes, ("%s" % phone.ip_addr, int(phone.sip_port)))
我可以看到Wireshark第二个数据包被发送。但第一个似乎被忽略了。
除非有人能在我的代码中看到打嗝,否则有没有办法在每个sendsock.sendto()
实例上执行if语句,以确保代码在被确认为已发送之前不会继续?
另外,我应该关闭sentock吗?
答案 0 :(得分:1)
UDP无法保证消息将同步到达或者它们甚至会到达,因此除非您从接收方程序发回确认响应,否则它永远不会被确认为已发送。这就是提高UDP与TCP速度的权衡。
但是,您可以检查while循环中sendto
的返回值(发送的字节数),而不是退出while循环,直到发送的字节与原始消息的字节匹配或超时值为达到。
此外,使用socketserver module可能更容易简化处理套接字的过程。