Linux下send错误代码32
問題描述:今天寫程序,socket后send出現這個問題,send的返回值為-1,而errno為32,這個錯誤代碼為broken pipe,即管道破裂。
?
?
問題形成原因:后來通過排查研究,發現出現該種問題出現的可能性為以下兩種:
1.socket失敗,與服務器端的鏈接沒有成功,從而管道破裂。
2.服務端將客戶端的socket斷開,一樣造成這樣的問題。
?
?
此時這樣的程序收到broken pipe的信號,會自動退出我們可以在產生信號前利用方法 signal(int signum, sighandler_t handler) 設置信號的處理。如果沒有調用此方法,系統就會調用默認處理方法:中止程序,顯示提示信息(就是我們經常遇到的問題)。我們可以調用系統的處理方法,也可以自定義處理方法。
對一個已經收到FIN包的socket調用read方法, 如果接收緩沖已空, 則返回0,
這就是常說的表示連接關閉. 但第一次對其調用write方法時, 如果發送緩沖沒問題,
會返回正確寫入(發送). 但發送的報文會導致對端發送RST報文,
因為對端的socket已經調用了close, 完全關閉, 既不發送, 也不接收數據. 所以,
第二次調用write方法(假設在收到RST之后), 會生成SIGPIPE信號, 導致進程退出.
為了避免進程退出, 可以捕獲SIGPIPE信號, 或者忽略它,
給它設置SIG_IGN信號處理函數:
signal(SIGPIPE, SIG_IGN);
這樣, 第二次調用write方法時, 會返回-1, 同時errno置為SIGPIPE.
程序便能知道對端已經關閉
---------------------
作者:JimmyRuin
來源:CSDN
原文:https://blog.csdn.net/u013267687/article/details/52441460
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的Linux下send错误代码32的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx源码阅读(二).初始化:mai
- 下一篇: 原神天云草实怎么获得,原神天云草实获得方