在tcp通訊過程中,當伺服器主動關閉套接字鏈結時,客戶端仍能傳送資料給伺服器,但是只能傳送兩次。兩次之後客戶端程式將會自動退出,程式不再執行。
這個問題出現的原因是對訊號sigpipe的處理不對。對乙個已經關閉的套接字進行寫入時,若client端接著發資料。根據tcp協議的規定,會收到乙個rst響應,client再往這個伺服器傳送資料時,系統會發出乙個sigpipe訊號給程序,告訴程序這個連線已經斷開了,不要再寫了,所以在第二次傳送資料時會響應sigpipe的處理機制,sigpipe訊號的觸發是嘗試寫資料到關閉的套接字,而sigpipe訊號的預設處理就是退出程式,停止執行。
所以在tcp套接字上傳送資料的任何程式都必須顯示處理sigpipe,以便保持健壯性。
可以更改訊號的處理方式,更改方法如下:
定義訊號的處理函式:
void linuxsignaldeal(int signo,struct siginfo *siginfo,void *myact)
設定訊號處理:
struct sigaction lstruaction;
sigemptyset(&lstruaction.sa_mask);
lstruaction.sa_flags = (sa_siginfo|sa_oneshot|sa_nomask);
lstruaction.sa_sigaction = linuxsignaldeal;
if(sigaction(sigpipe,&lstruaction,null) < 0)
perror("\ninstall signal error:\n");
當訊號被觸發時,會自動呼叫linuxsignaldeal函式進行處理而不是執行預設的處理(停止程式),注意:通過測試發現,當函式被呼叫之後對訊號的處理將又會恢復為預設處理,所以需要再次設定。
然而在網路程式設計中我們有時不是需要更改對sigpipe的處理,而是忽略,這樣程式不會自動停止。
停止方法如下:
呼叫:signal(sigpipe,sig_ign);//忽略訊號
對於為什麼會在傳送兩次後觸發sigpipe這個訊號,可以參考tcp通訊的三次握手和四次揮手的過程。
tcp與ip協議在通訊中的差異
方式一 tcp 方式二 http ip 網際協議 tcp 傳輸控制協議 通過序列化應答和必要時重發資料報,tcp 為應用程式提供了可靠的傳輸流和虛擬連線服務。tcp 主要提供資料流轉送,可靠傳輸,有效流控制,全雙工操作和多路傳輸技術。可查閱 tcp 部分獲取更多詳細資料。至於http協議,它是tcp...
通訊中的backhaul
backhaul 可以翻譯成回程,也叫回程線路 在現有的無線通訊中,backhaul指的是基站和基站控制器之間的鏈結 一般使用者先接入基站,基站再與基站控制器通訊,然後進入核心網 在無線技術中,回程 backhaul 指的是從信元站點向交換機傳送語音和資料流量的功能。在衛星通訊中,回程是指衛星向自身...
SOCKET通訊中TCP資料報大小的確定
mss maximun segment size 最大分段大小,tcp有乙個最大分段大小,用於通告對端每個分段中能傳送的最大tcp資料量。mss的目的是告訴對端其重組緩衝區大小的實際值,從而避免分片。mss經常設計成mtu減去ip和tcp首部的固定長度。乙太網中使用ipv4mss值為1460,使用i...