2011-06-02 25 views
0

我想知道是否有可能有一個套接字與發送不工作(因爲同行的緩衝區可能),而接收部分仍然工作?套接字發送部分失敗,但收到的一部分,可能嗎?

編輯:

在對等體的情況下,不進行半緊密連接,並且其它太長來處理其接收緩衝區(因此它的接收緩衝器滿),我可以有一個錯誤只在我的發送部分?

回答

1

簡短回答:是的。如果遠程節點以較慢的速率接收數據(可能是由於recv呼叫之間的數據處理速度較慢),它會降低發送端的傳輸速度:ACK將會緩慢發送,並且發送緩衝區將很快變滿,這會導致您的套接字發送操作阻止或返回錯誤。另一方面,由於TCP是雙向協議,TCP協議棧使用不同的內核緩衝區來接收數據,所以本地對等端仍然可以接收遠端對端發送的數據。

2

如果您關閉您的連接端(半關閉連接),則您可以通過該套接字無法發送該套接字。你可以用shutdown(2)來做到這一點。當你用這種方式關閉連接時,你會說:「我沒有別的話要說,但如果你發送東西,我會看看它」。

另一邊的緩衝區應該沒有區別。當你的東西,你不會把它放在你的同行的緩衝區。你把它放在內核的緩衝區中,然後內核將它發送給對等體。

有一個工作連接幾乎沒有機會,並填寫您的緩衝區,從您得到錯誤點send(2)

1

當然有可能。例如,如果您有unix域套接字,並且沒有人正在讀取它。如果您詢問TCP或UDP套接字,答案可能會更復雜

相關問題