關於檢測TCP連線斷開
因為專案需求,需要用到linux下的C程式設計來開發,之前都是在STM下進行的。所以對linux的一些API和開發的一些小技巧不是特別的熟悉。因為專案的網路通訊是用在TCP協議上的。在連線的時候 如果伺服器斷開了,客戶端也相應斷開,但是如果伺服器再繼續連線,這時候客戶端應該要進行重新連線,所以要有一個機制進行檢測,之前用recv的返回值如果是-1則進行重連,因為重連之前要關閉socket號,會發現這樣子很容易一直在反覆連線。不合理,所以參考了http://blog.sina.com.cn/s/blog_6b633e8f0100kt39.html這個部落格進行了修改。
當伺服器close一個連線時,若client端接著發資料。根據TCP協議的 規定,會收到一個RST響應,client再往這個伺服器傳送資料時,系統會發出一個SIGPIPE訊號給程式,告訴程式這個連線已經斷開了,不要再寫 了。
根據訊號的預設處理規則SIGPIPE訊號的預設執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把 SIGPIPE設為SIG_IGN
如:signal(SIGPIPE, SIG_IGN);
這時SIGPIPE交給了系統處理。
伺服器採用了fork的話,要收集垃圾程式,防止殭屍程式的產生,可以這樣處理:
signal(SIGCHLD,SIG_IGN);
交給系統init去回收。
這裡子程式就不會產生殭屍程式了。
在linux下寫socket的程式的時候,如果嘗試send到一個disconnected socket上,就會讓底層丟擲一個SIGPIPE訊號。
這個訊號的預設處理方法是退出程式,大多數時候這都不是我們期望的。因此我們需要過載這個訊號的處理方法。呼叫以下程式碼,即可安全的遮蔽SIGPIPE:
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction( SIGPIPE, &sa, 0 );
signal設定的訊號控制程式碼只能起一次作用,訊號被捕獲一次後,訊號控制程式碼就會被還原成預設值了。
sigaction設定的訊號控制程式碼,可以一直有效,值到你再次改變它的設定。
struct sigaction action;
action.sa_handler = handle_pipe;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGPIPE, &action, NULL);
void handle_pipe(int sig)
{
//先關閉之前的socket號 再進行重新連線
}
相關文章
- GOLANG探測HTTP連線斷開GolangHTTP
- ? 抓包分析 TCP 建立和斷開連線的流程TCP
- 4個實驗,徹底搞懂TCP連線的斷開TCP
- TCP-ip建立連線時3次握手,斷開連線時4次揮手TCP
- Qt TCP通訊客戶端斷開連線有哪些方法QTTCP客戶端
- tcp 連線TCP
- 對於網線斷開後重新連上 tcp socket 連線保持 ESTABLISH 狀態不變的問題的解釋(轉)TCP
- Http 和TCP的關係,TCP長連線和短連線有什麼區別?HTTPTCP
- TCP 連線管理TCP
- 關於肺癌檢測
- linux修改TCP連線數(centos實測)LinuxTCPCentOS
- 檢測ftp連線問題FTP
- 關於面向連線與面向無連線
- 第二篇:一個經典的比喻( 關於TCP連線API )TCPAPI
- java操作Oracle 方式一 ( 連線-》操作-》斷開連線 )JavaOracle
- 什麼是Socket連線?它與TCP連線有什麼關係TCP
- golang tcp連線池GolangTCP
- TCP的連線建立TCP
- 關於紅旗linux網路連線時斷時連的問題(轉)Linux
- 保持ssh的連線不斷開
- 1204 斷開式連線
- 區分socket連線和tcp/ip連線TCP
- Laravel-Echo 線上離線檢測判斷Laravel
- 網路斷線檢測中用到的popen
- TCP協議三次握手連線四次握手斷開和DOS攻擊TCP協議
- tcp的半連線攻擊和全連線攻擊--TCP DEFER ACCEPTTCP
- ADO 資料庫連線斷開重連資料庫
- 關於jetty連線關閉問題Jetty
- 相關技術連線,不斷新增中...
- TCP連線注意事項TCP
- 網路連線斷開如何解決 win10系統網路連線經常斷開Win10
- centOS伺服器 netstat命令 檢視TCP連線數資訊CentOS伺服器TCP
- [從0到1編寫伺服器]TCP連線建立與斷開狀態變化伺服器TCP
- cmd 工具 ssh 保持連線不斷開
- Mysql關於長連線短連線優劣比較MySql
- VMRC控制檯的連線已斷開..正在嘗試重新連線
- .NET Socket TCP 50W線上連線互動測試TCP
- 使用netstat檢測及監測網路連線