2014-11-09 93 views
0

我正在调试一个python程序,应用程序无法按预期接收udp数据包。最后我发现它是UdpSocket.connect导致UdpSocket丢失这些数据包。看下面的代码:UDP连接导致套接字丢失数据包?

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少了点retuern。我希望有人能够帮助解释为什么sock.recv每次在这里都不会返回

+0

UDP连接丢失数据包很常见 – 2014-11-09 00:31:35

+0

@freeforalltousez数据包已到达机器,但是socket.recv不返回。 – Steve 2014-11-09 05:48:40

回答

0

您没有提到您希望接收(但未能)的数据包来自哪里。不过,我猜他们不是来自你所连接的地址。请参阅connect(2)的手册页 - 这是您在使用此Python API时调用的内容 - 有关此原因的信息。特别是:

如果套接字的sockfd是SOCK_DGRAM类型的然后addr是到数据报默认发送的地址,并从其中数据报接收的唯一地址。

(强调我的)。

+0

每当上述代码尝试将本地计算机注册到服务器时,主机(server_ip,5000)将发回两个udp数据包。另外,udp数据包在路上并没有丢失,而是到达了本地机器,但是socket.recv永远不会返回,从而导致程序错过这些数据包。 – Steve 2014-11-09 05:52:09

+0

我不认为你仔细阅读答案。 – 2014-11-09 11:42:17

+0

我不理解这部分:从中接收数据报的唯一地址。在这个例子中,它是否意味着从(server_ip,5000)以外的(server_ip,9)接收数据包?第二个声明 - sock.sendto(packet,(server_ip,5000)) - 不会更改地址? – Steve 2014-11-13 23:37:48