問題:網絡
寫了一個server和一個client,UNIX套接字的,server不斷接收消息並打印出來,client是一個交互程序,輸入一個消息回車發送,接着又能夠輸入消息。
出問題了:
當server監聽着,client第一次發送消息成功,server接收並打印出來了。
client第二次發送消息沒成功而且結束程序了,server沒接收到消息,保持繼續監聽。
我用GDB調試時,發現client第二次發送消息時,client收到SIGPIPE(Broken Pipe)信號。server明明還監聽着,並且再次啓動client仍是第一次成功,第二次失敗退出。socket
一樣的,當client由於斷開(關閉了網絡描述符sfd,或者ctrl+c/ctrl+\異常斷開),server端也產生SIGPIPE信號。tcp
分析:spa
TCP協議是端到端的傳輸控制協議,之因此是「端到端」的協議,是由於」路由「是由IP協議負責的,TCP協議負責爲兩個通訊端點提供可靠性保證,這個可靠性不是指一個端點發送的數據,另外一個端點確定能收到(這顯然是不可能的),而是指,數據的可靠投遞或者故障的可靠通知。調試
所謂的「端到端」,指的是在通訊兩端之間創建了一個全雙工的通訊管道,既然是管道,就不得不瞭解管道。server
管道的特色:blog
管道特性的表現:進程
注意:全雙工,指的是每一端均可讀可寫。前提是對端打開。若是對端都關閉了,本端讀數據爲空,不會出錯;但本段寫數據確定出錯。ip
總結:內存
若是要進行順利的管道通訊:管道的兩端必需都打開。
也就是說tcp通訊時,client端經過 pipe發送信息到server端後,client端掛沒必要,這時server端返回信息,向pipe些內容,就會出錯。
解決方法:
一、signal(SIGPIPE,SIG_INT);//(全局範圍內)
二、setsocketop;//(tcp特性設置)
/// sock 就是設置不發送 `SIGPIPE` 信號的 socket 變量
int value = 1;
setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));