2011-11-10 30 views
1

我正在爲Windows XP和Seven開發網絡應用程序。應用程序通過UDP接收數據並使用阻塞套接字,選擇(不是WSAPoll)和recv函數。recv()沒有時間從Win 7上的套接字接收所有UDP數據包?

爲了測試我使用的是不同的操作系統安裝兩個相同的筆記本電腦:戴爾Latitude D630酷睿2 2.2GHz的,4GB內存,Broadcom公司的NetXtreme千兆57XX控制器。我已經得到了以下結果:

Windows XP專業版32位:網絡監控應用表明,該網絡接口從LAN接收數據以平均時速35兆字節/秒。應用程序從平均速度爲30 MBytes/s的套接字接收數據,並檢測到13%的損失。

Windows 7 Enterprise 32bit:網絡監視器應用程序顯示網絡接口從LAN接收平均速度爲35 MBytes/s的數據。應用程序從平均速度爲10 MBytes/s的套接字接收數據,並檢測到65%的損失。

看起來應用程序沒有足夠的時間從Windows 7上的套接字接收所有數據包。但爲什麼結果與Win XP不同?

+2

不同的硬件驅動程序「MMCSS」會限制其他7個網絡活動。我會檢查增加接收緩衝區是否會合理降低兩個系統中的丟失率。 –

+0

套接字創建後,我的接收緩衝區通過setsockopt設置爲64K。感謝你的回答。我會檢查你的assupmtions。 – Rom098

+1

是的,增加緩衝區大小使接收更穩定。結果不同的原因是Windows 7上的接收緩衝區大小應該比Win XP上的大。我將尺寸增加到了256KBytes,並且獲得了35MBps的速度,兩者都損失了3%。謝謝。 – Rom098

回答

0

對於處理這個或類似問題的任何人,我都會提供以下服務,因爲我在處理類似問題時遇到了這篇文章。我希望這會在一段時間內拯救別人。

我也想感謝@Roman R.上面他的評論和@ Rom098用於指示評論跟進,在緩衝區大小的變化幫助他/她。

它使用與UDP Windows套接字在低數據率通信的多個終端之間的數據的應用程序工作正常的Windows XP,但與遷移到Windows 7,我們開始經歷跌落與網絡消息的問題。

的體系結構是一個客戶機終端具有通過發送和接收與所述客戶端維持其自身的狀態的一系列UDP消息的服務器終端的對話。客戶終端有一個線程,即客戶線程,用於處理用戶輸入以及向服務器終端發送和接收消息。服務器終端有一個線程,即服務器線程,它處理來自其他終端的請求消息以及它自己的客戶端線程。簡單的消息序列看起來像:

  • 客戶終端發送的請求消息發送到服務器終端
  • 服務器終端用確認消息
  • 服務器終端進程請求進行響應,併發送響應消息到客戶端
  • 客戶終端向服務器終端發送確認

查看上面的註釋,我們使用調試器進行了檢查,發現Windows 7有一個預設t WinSock接收併發送8K(8192字節)的緩衝區大小。縱觀互聯網,似乎Windows XP對網絡流量的處理速度更高。

我們在處理通信的網絡層中做了兩處更改。

第一種方法是使用setsockopt()函數來使用以下代碼的接收和發送緩衝區的大小的兩倍。

iOptLen = sizeof(INT); 
error = getsockopt (iSocket, SOL_SOCKET, SO_RCVBUF, (PCHAR)(&iOpt), &iOptLen); 
if (error < 0) { 
    error = WSAGetLastError(); 
} else if (iOpt < 1024 * 16) { 
    iOpt = 1024 * 16; 
    error = setsockopt(iSocket, SOL_SOCKET, SO_RCVBUF, (const PCHAR)(&iOpt), sizeof(iOpt)); 
    if (error < 0) { 
     error = WSAGetLastError(); 
    } 
} 
iOptLen = sizeof(INT); 
error = getsockopt (iSocket, SOL_SOCKET, SO_SNDBUF, (PCHAR)(&iOpt), &iOptLen); 
if (error < 0) { 
    error = WSAGetLastError(); 
} else if (iOpt < 1024 * 16) { 
    iOpt = 1024 * 16; 
    error = setsockopt(iSocket, SOL_SOCKET, SO_SNDBUF, (const PCHAR)(&iOpt), sizeof(iOpt)); 
    if (error < 0) { 
     error = WSAGetLastError(); 
    } 
} 

我們所做的第二個變化是,如果客戶線程等待確認和響應消息從所述服務器終端進來然後處理該響應消息作爲確認和響應的組合。我們正在做的是假設確認消息在某個時候被丟棄了。

有了這兩個更改,滯後不再顯而易見,儘管我們的測量表明有時從服務器終端到客戶端的確認消息仍在丟失。

又見

Change default socket buffer size under Windows它採用了Windows註冊表的變化,從8K修改默認的緩衝區大小爲別的東西。

What is the size of a socket send buffer in Windows?這是關於TCP,但提供了有關setsockopt()的其他信息。

Winsock UDP packets being dropped?它討論了一系列提供附加信息的答案的類似問題。

Application Note: Windows 2000/XP TCP Tuning for High Bandwidth Networks來自Innominate.com有一些有趣的信息,雖然也許有點過時,據我所知,Windows 7的網絡層被重寫。

Real time communications over UDP protocol來自Michael Pan在codeproject.com上有很多關於使用UDP的技術問題的細節。

相關問題