1. 程式人生 > >Linux下send錯誤程式碼32

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 版權宣告:本文為博主原創文章,轉載請附上博文連結!