在linux下寫socket的程式的時候,如果嘗試send到乙個disconnected socket上,就會讓底層丟擲乙個sigpipe訊號。
當伺服器close乙個連線時,若client端接著發資料。根據tcp協議的規定,會收到乙個rst響應,client再往這個伺服器傳送資料時,系統會發出乙個sigpipe訊號給程序,告訴程序這個連線已經斷開了,不要再寫了。根據訊號的預設處理規則sigpipe訊號的預設執行動作是terminate(終止、退出),所以client會退出。
1. 客戶端到服務端之間網路斷掉,或者服務端斷電等,物理連線斷掉了,這種情況下客戶端不會退出,send函式正常執行,不會感覺到自己出錯。因為由於物理網路斷開,服務端不會給客戶端回應錯誤訊息,沒有rst響應,自然也不會產生sigpipe訊號。但是當服務端再恢復正常的時候,對客戶端send來的訊息會產生rst響應,客戶端就收到sigpipe訊號了,程式退出,但是這時send函式是能夠返回 -1的。可以進行異常處理。
2.客戶端到服務端的網路能通,服務程式掛掉,客戶端程式會馬上退出,因為服務端能正常返回錯誤訊息,客戶端收到,sigpipe訊號就產生了。不過我不確定此時服務端返回是的rst響應,抓包來看沒有rst標誌。
client端通過 pipe 傳送資訊到server端後,就關閉client端, 這時server端,返回資訊給 client 端時就產生broken pipe 訊號了。
我遇到的情況是:建立套接字的ip為空,port=-1,但是仍然能夠建立套接字成功並connect成功(非阻塞套接字,connect後立即用select檢查)。然後就使用該套接字send資料,此時perror就列印send: broken pipe。接下來在用該套接字recv就出現recv:transport endpoint is not connected。
通常要先檢查建立套接字的必要資料的正確性..
另外獲取gethostbyname的出錯資訊不能用perror,而要用herror..
Linux網路程式設計
linux網路程式設計 當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 1.和伺服器的步驟一樣。2.通過設定套介面位址結構,我們說明,客戶端要與之通訊的伺服器的ip位址和 埠。...
linux 網路程式設計
當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 現在讓我們來看看網路程式客戶端的程式設計步驟 以上的步驟,是比較普遍的,我們可以從中看出,編寫網路程式是很有意思的,同 時,也不...
linux 網路程式設計
套接字程式設計 struct sockaddr unsigned short sa family 位址協議,ipv4 tcp ip af inet,ipv6 af inet6 char sa data 14 14位元組的位址協議 struct sockaddr in unsigned short s...