2017-04-25 39 views
2

如果一個C socket的recvmsg()有一個隊列,我怎麼知道有多少項目在隊列中積壓?在C中,對於套接字,recvmsg()是否有一個隊列?

我的問題是,我從recvmsg()收到的東西后,代碼的速度有時慢於發送到recvmsg()的數據的速度,這會在邏輯上導致隊列?如果隊列變得太大會發生什麼?

例如,如果這是我的recv()代碼:

while (recvmsg(SocketA,...) > 0) 
{ 
    ... 
    ...something that takes 1.5 seconds to execute/complete... 
    ... 
} 

,如果下面的函數在其他地方被調用,每隔1秒鐘

// gets called every 1 second 
int send_to_sock() 
{ 
    ... 
    send(SocketA, ...); 
    ... 
} 

我查recvmsg的參考頁( ),但他們中沒有一個提到有關隊列的任何內容,但似乎有一個隊列,因爲我觀察到遞增累加的延遲。但是,如果隊列變得太長,代碼將停止工作,所以我想知道是否有辦法檢查隊列的長度。

+0

爲什麼你有'recv'的函數定義?通常情況下,'recv'是由OS定義的... –

+0

套接字確實有緩衝區。如果這就是你所指的,這可能是有趣的:http://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux –

+0

我們,,數據是在你和同伴之間的空間和時間中展開。它在服務器,客戶端和中間路由器中排隊。它沿着海底光纖在地面站和衛星之間的自由空間中航行。有數據在那裏,但你不知道它在哪裏或多少。 – ThingyWotsit

回答

2

這不是一個隊列,它是一個與大多數I/O設備相關的緩衝區,不僅是套接字。例如,當你從標準輸入讀取類似scanf的數據時,當你按下回車鍵時,數據會進入你的程序。你認爲在哪裏同時存儲了所有按鍵?

這些緩衝區的具體細節是實現定義的,但通常,套接字發生的情況是,如果緩衝區已滿,則丟棄新數據包。您可以在How to find the socket buffer size of linuxHow can I tell if a socket buffer is full?中找到有關查詢緩衝區狀態的更多信息。

2

是的。有一個套接字接收緩衝區。其最大尺寸可通過使用SO_RCVBUF選項的getsockopt()setsockopt()來設置。當它填充時,在TCP的情況下,發送者被告知停止發送;在UDP的情況下,進一步傳入的數據被丟棄。