2011-07-28 102 views
2

我有一臺服務器運行在Windows 7臺式電腦上,客戶端運行在Windows XP聯想筆記本電腦上。UDP數據讀取不正確(延遲)

下保持在一個循環中發生的事情:

  • 的客戶端廣播包含一些ID信息的UDP數據包。
  • 服務器獲取廣播並用另一個帶有一些數據的UDP數據包進行應答。

我可以在Wireshark中看到服務器正在發送正確的數據,但RECVFROM函數正在返回一些其他數據。大約20-30秒後,數據最終被正確讀取。

如果我在桌面上運行服務器和客戶端,它可以正常工作。有任何想法嗎?


相關的代碼:

do 
    { 
     result=recvfrom(_socket,buff,buffLen,0,(SOCKADDR*)&SenderAddr,&SenderAddrSize); 
     if(result != SOCKET_ERROR) 
     { 
      //small processing 
      ..... 
     //// 
     sendto(_socket,buff,16,0,(SOCKADDR*)&SenderAddr,sizeof(SenderAddr)); 
     } 
    while(true) 
+0

我想這不是一個endianess問題,現在呢? –

+2

看起來不是這樣,因爲大約20秒後數據正確無誤....並且在wireshark中數據始終正確......非常奇怪。 –

+0

另一個提示可能是......關閉服務器之後......客戶端仍然獲得UDP數據包一段時間:D –

回答

0

以有點猜測這裏。

我無法想象你的UDP數據包在某處會有20秒的驚歎。畢竟公共互聯網上的全球RTT通常比那個少40倍。所以我認爲你只是不斷重新發送你的數據,直到你得到預期的迴應。

如果我對我的假設是正確的,那麼你看到的是一個普通的UDP 數據包丟失。那臺筆記本電腦在無線連接上?客戶端應用程序是否阻止某些輸入?在筆記本電腦上也運行wireshark。你看到與發送者(服務器)端相同的數據包和序列數據包嗎?如果是這樣,那麼客戶端不會足夠快地使用這些數據包。如果你真的看到客戶端上的數據包延遲20秒,那麼你真的需要描述更多的設置來解釋魔術:)

0

感謝您的回答.. 問題是sendto方法是在筆記本電腦上的表現與桌面相比有所不同。 在laptot sendto正在發送3個UDP數據包,在destop上只有一個。 我的應用程序期望只有一個數據包,所以處理時間+乘以3會產生延遲的印象。 我不明白爲什麼發生這種情況,但這是問題所在。