3 回答

TA貢獻1851條經驗 獲得超3個贊
觀察網絡可能要花費一些時間-總的來說,關閉后的總時間大約為2分鐘(是的,幾分鐘?。?,然后才假定發往該端口的數據包全部失效。在某些時候檢測到錯誤情況。只需少量寫入,您就可以在系統的MTU中,因此消息已排隊等待發送。大量寫入時,您比MTU還要大,系統會更快地發現問題。如果忽略SIGPIPE信號,則函數將在管道斷開時返回EPIPE錯誤-在檢測到連接斷開的某個時候。

TA貢獻1835條經驗 獲得超7個贊
套接字的當前狀態由“保持活動”活動確定。在您的情況下,有可能在發出send調用時,keep-alive活動會告知套接字處于活動狀態,因此send調用會將所需的數據(40字節)寫入緩沖區,并返回而不會出現任何錯誤。
當您發送更大的塊時,發送調用將進入阻塞狀態。
發送手冊頁也確認了這一點:
當消息不適合套接字的發送緩沖區時,除非套接字已置于非阻塞I / O模式,否則send()通常會阻塞。在非阻塞模式下,在這種情況下它將返回EAGAIN
因此,在阻塞空閑可用緩沖區的同時,如果(通過保持活動機制)通知調用方另一端不再存在,則發送調用將失敗。
使用所提到的信息很難預測出確切的情況,但是我相信,這應該是您遇到問題的原因。

TA貢獻1895條經驗 獲得超7個贊
也許40個字節適合管道緩沖區,而40000個字節不適合嗎?
編輯:
當您嘗試寫入關閉的管道時,發送過程將發送SIGPIPE信號。我不確切地知道什么時候發送信號,或者管道緩沖區對此有什么影響。您可以通過使用sigaction調用捕獲信號來恢復。
- 3 回答
- 0 關注
- 636 瀏覽
添加回答
舉報