TCP通訊中對SIGPIPE的處理

2021-06-29 16:08:45 字數 1157 閱讀 9993

在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...