UDP连接导致套接字丢失数据包?

时间:2014-11-09 00:24:02

标签: python linux sockets networking

我正在调试一个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在这里不会每次都返回

1 个答案:

答案 0 :(得分:0)

您没有提到您希望接收(但未能)的数据包来自何处。不过,我猜它们并非来自你所连接的地址。请参阅connect(2)的手册页 - 这是您在使用此Python API时调用的内容 - 以获取有关其重要性的信息。特别是:

  

如果套接字sockfd的类型为SOCK_DGRAM,则addr是默认发送数据报的地址,是接收数据报的唯一地址

(强调我的)。