2010-04-11 13 views
3

Linux上的套接字如何緩衝工作? 即,如果服務器不讀取套接字並且客戶端繼續發送數據。 那麼會發生什麼?套接字的緩衝區有多大?客戶是否知道它會停止發送?Linux上的套接字如何緩衝工作

回答

4

對於UDP套接字客戶端永遠不會知道 - 服務器端將在接收緩衝區填充後開始丟棄數據包。

另一方面,TCP執行flow control。服務器的內核將逐漸減少窗口,所以客戶端將能夠發送越來越少的數據。在某個時候,窗口將降至零。此時客戶機填滿其發送緩衝區並從send(2)收到錯誤。

1

TCP套接字在協議棧中使用緩衝。堆棧本身實現流量控制,因此如果服務器的緩衝區已滿,它將停止客戶端堆棧發送更多數據。您的代碼會將此視爲阻止致電send()。緩衝區大小可以在幾個kB到幾個MB之間變化很大。

1

我假設您正在使用send()recv()進行客戶端和服務器通信。因此,send()將返回已發出的字節數。這並不一定等於希望發送出去的字節數,所以您需要了解這一點併發送剩餘的字節數。

現在,recv()返回讀取到緩衝區的字節數。所以如果recv返回0,那麼服務器可能關閉了連接。