我有一個在Windows XP平臺(i7 2.1 Ghz處理器)上運行的應用程序。此應用程序是通過UDP在主節點和從節點之間進行基於主/從的通信。 主站發送請求,從站節點在其響應(突發模式)中發送每5毫秒的數據包,每個數據包包括標頭1300字節。Winsock函數的執行時間太長
回到主節點,主線程接收數據並將其寫入隊列,觸發並行線程從線程讀出。
問題: 讀取下一個數據包時,Winsock API的執行時間很長,所以數據正在從緩衝區中丟失。
執行時間:Recvfrom() - 200 - 400微秒。
Open_Sock()
{
socket();
//Error check
connect();
//Error Check
}
Receivethread()
{
sock again:
select(socket, read,write,excep,(0,0));
//error check
rc = recvfrom(socket,buf,len,0,&s_addr,&cln_alen)
if(rc>0) {
enqueue(queue,buf);
}
}
我確信Winsock API不需要很長時間才能獲取下一個數據包。 但我找不到任何有關真實執行時間的信息。任何方向的幫助真的很感激。
使用IOCP,排隊大量緩衝區,讓內核填滿他們的。稍後處理它們。 – 2013-03-08 15:41:27
能夠爲每個發送緩衝區調用recvfrom至少12.5次似乎應該足夠充分(5ms/400us = 12.5)。你確定你正在處理的數據很快就完成了嗎?另外,我們發現Windows傾向於丟棄比我們認爲的更多的UDP數據包。我們將一個客戶端/服務器Windows應用程序移植到Linux上,並使用相同的硬件丟棄了零個數據包。 – 2013-03-08 18:28:23
默認情況下,套接字以阻塞模式運行,所以'recvfrom()'將在退出之前等待數據到達。既然你使用'select()',那麼在你調用'recvfrom()'之前,套接字是否處於可讀狀態呢?知道套接字處於阻塞模式,除非你的線程在等待數據時需要做其他線程,否則你也可以放棄select()。 – 2013-03-08 20:21:27