我正在调试一个python程序,应用程序无法按预期接收udp数据包。最后我发现它是UdpSocket.connect导致UdpSocket丢失这些数据包。见下面的代码:
def main:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.connect((server_ip, 9)) #This results in the issue
#Use sock.bind((local_ip, 12345))
#instead would solve the problem
localip, localport = sock.getsockname()
packet = GetRegisterData(localip, localport)
sock.sendto(packet, (server_ip, 5000)) #the host (server_ip, 5000) will
#always send back two udp packets
#to respond this statement
sleep(1)
while True:
response = sock.recv(1024) #packets from (server_ip, 5000) reached
#machine but this statement never return
if not len(response)
break
print response
我对Python很陌生,并且不明白为什么会这样。有人帮忙解释一下吗?
[更新]
我使用tcpdump来捕获数据包,只是为了找到丢失的数据包已经到达机器,但由于未知的原因,sock.recv只是没有返回。我希望有人帮助解释为什么sock.recv在这里不会每次都返回 。
答案 0 :(得分:0)
您没有提到您希望接收(但未能)的数据包来自何处。不过,我猜它们并非来自你所连接的地址。请参阅connect(2)
的手册页 - 这是您在使用此Python API时调用的内容 - 以获取有关其重要性的信息。特别是:
如果套接字sockfd的类型为SOCK_DGRAM,则addr是默认发送数据报的地址,是接收数据报的唯一地址。
(强调我的)。