2014-11-09 100 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