亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是什么原因導致管道破裂錯誤?

是什么原因導致管道破裂錯誤?

C
神不在的星期二 2019-12-25 15:44:51
我知道關閉對等端的套接字時會引發管道破裂錯誤。但是,在我的測試中,我注意到當對等端關閉時,在此端立即進行“發送”調用并不總是會導致管道錯誤。例如:關閉對等端的套接字后(我嘗試通過調用close進行干凈關閉,也通過殺死對等體來異常關閉),如果我嘗試發送40個字節,那么管道不會中斷,但是,如果我嘗試發送40000字節,則立即給出管道中斷錯誤。到底是什么原因導致管道破裂,并且可以預測其行為?
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

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


查看完整回答
反對 回復 2019-12-25
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

套接字的當前狀態由“保持活動”活動確定。在您的情況下,有可能在發出send調用時,keep-alive活動會告知套接字處于活動狀態,因此send調用會將所需的數據(40字節)寫入緩沖區,并返回而不會出現任何錯誤。


當您發送更大的塊時,發送調用將進入阻塞狀態。


發送手冊頁也確認了這一點:


當消息不適合套接字的發送緩沖區時,除非套接字已置于非阻塞I / O模式,否則send()通常會阻塞。在非阻塞模式下,在這種情況下它將返回EAGAIN


因此,在阻塞空閑可用緩沖區的同時,如果(通過保持活動機制)通知調用方另一端不再存在,則發送調用將失敗。


使用所提到的信息很難預測出確切的情況,但是我相信,這應該是您遇到問題的原因。


查看完整回答
反對 回復 2019-12-25
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

也許40個字節適合管道緩沖區,而40000個字節不適合嗎?


編輯:


當您嘗試寫入關閉的管道時,發送過程將發送SIGPIPE信號。我不確切地知道什么時候發送信號,或者管道緩沖區對此有什么影響。您可以通過使用sigaction調用捕獲信號來恢復。


查看完整回答
反對 回復 2019-12-25
  • 3 回答
  • 0 關注
  • 636 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號