TCP異常斷開檢測

2021-08-02 11:42:26 字數 2048 閱讀 6235

tcp異常斷開是指在突然斷電,直接拔網線等等情況下,如果通訊雙方沒有進行資料傳送通訊等處理的時候,無法獲知連線已經斷開的情況.

在通常的情況下,為了使得socket通訊不受作業系統的限制,需要自己在應用層實現心跳包機制,來檢查異常斷開的情況,一般的方式就是伺服器在一段時間沒有收到客戶端資料報時,定時發包,然後客戶端回應,如果已經出現異常斷開則伺服器接收會返回錯誤,而客戶端在指定時間內沒有收到資料報,則主動向伺服器發包,得到錯誤就說明斷開.諸如此類的方式就是自己實現的心跳包機制.

但作業系統本身也自帶了一些心跳包機制,這些機制是由socket的tcp棧底層實現的,不會影響應用層通訊,也不需要應用層自己處理,發現異常斷開可以自行檢查出來並返回錯誤(它的本質也是在空閒時傳送心跳包).以下介紹一下windows以及linux下的方法.

首先介紹windows下的方法,該方式要求通訊雙方必須都是windows nt以上作業系統(如果是其它版本作業系統,如linux等等,不敢保證100%無效).msdn中有描述wsaioctl中的sio_keepalive_vals選項,該選項以及struct tcp_keepalive的定義在mstcpip.h有,不進行說明了,直接看**:

#include

dword retbytes;

tcp_keepalive inkeepsetting;

tcp_keepalive retkeepsetting;

inkeepsetting.onoff = 1;                //探測次數

inkeepsetting.keepalivetime = 5500;        // 首次探測開始前的tcp無資料收發空閒時間

inkeepsetting.keepaliveinterval = 3000;    // 每次探測的間隔時間

if (wsaioctl(aptsock, sio_keepalive_vals, 

&inkeepsetting,

sizeof(inkeepsetting),

&retkeepsetting,

sizeof(retkeepsetting),

&retbytes,

null,

null) != 0)

linux下的方式是通過setsockopt來設定選項,見**(**從網路上摘錄了部分):

#include  

……#define socket_error (-1)

// 以秒為單位

int   keepalive = 1;       //設定keepalive 

int   keepidle = 5;        //首次探測開始前的tcp無資料收發空閒時間

int   keepinterval = 3;  //每次探測的間隔時間

int   keepcount = 2;     //探測次數

if(setsockopt(s,sol_socket,so_keepalive,(void*)&keepalive,sizeof(keepalive)) == socket_error)

printf("call setsockopt error, errno is %d/n", errno);

if(setsockopt(s,sol_tcp,tcp_keepidle,(void   *)&keepidle,sizeof(keepidle)) == socket_error)

printf("call setsockopt error, errno is %d/n", errno);

if(setsockopt(s,sol_tcp,tcp_keepintvl,(void   *)&keepinterval,sizeof(keepinterval)) == socket_error)

printf("call setsockopt error, errno is %d/n", errno);

if(setsockopt(s,sol_tcp,tcp_keepcnt,(void   *)&keepcount,sizeof(keepcount)) == socket_error)

printf("call setsockopt error, errno is %d/n", errno);

TCP連線異常斷開檢測

tcp是一種面向連線的協議,連線的建立和斷開需要通過收發相應的分節來實現。某些時候,由於網路的故障或是一方主機的突然崩潰而另一方無法檢測到,以致始終保持著不存在的連線。下面介紹一種方法來檢測這種異常斷開的情況 1 在tcp協議中提供了keepalive檢測。該選項使能後,在乙個tcp連線上,若指定的...

TCP連線異常斷開的檢測

華清遠見嵌入式學院 講師。tcp是一種面向連線的協議,連線的建立和斷開需要通過收發相應的分節來實現。某些時候,由於網路的故障或是一方主機的突然崩潰而另一方無法檢測到,以致始終保持著不存在的連線。下面介紹一種方法來檢測這種異常斷開的情況 1 在tcp協議中提供了keepalive檢測。該選項使能後,在...

socket選項自帶的TCP異常斷開檢測

tcp異常斷開是指在突然斷電,直接拔網線等等情況下,如果通訊雙方沒有進行資料傳送通訊等處理的時候,無法獲知連線已經斷開的情況.在通常的情況下,為了使得socket通訊不受作業系統的限制,需要自己在應用層實現心跳包機制,來檢查異常斷開的情況,一般的方式就是伺服器在一段時間沒有收到客戶端資料報時,定時發...