TCP長連接保持連接狀態TCP keepalive設置


轉自:http://blog.csdn.net/embedded_sky/article/details/42077321

對於TCP長連接保活是十分必要的,原因如下:

      1、系統多在OA網和外網間有防火牆隔離,很多防火牆對一段時間內沒有報文活動的socket會自動關閉。

      2、對於非正常斷開的連接系統並不能偵測到,比如防火牆關閉端口、網線被拔掉、電腦突然奔掉、未關閉應用程序直接關機(服務端無法釋放資源)。

     (調用close(fd)為正常斷開,連接對端可以偵測到)

 

TCP長連接保持的兩種辦法:

 

1) 應用層面的心跳機制

自定義心跳消息頭.,一般客戶端主動發送到服務端,服務器接收后進行回應(也可以不回應),以便能夠偵測連接是否異常斷開。

2) TCP協議自帶的保活功能

通過設置TCP keepalive的屬性,打開socket的keepalive屬性,並設置發送底層心跳包的時間間隔。TCP/IP五層網絡模型,我們調用socket等接口是應用層的函數,TCP keepalive是在底層定時發送心跳報文,服務器端接收到底層的心跳報文直接丟棄,不關心其內容。

 

使用TCP keepalive來保持長連接狀態顯然要舒服一些,直接調用系統的API即可實現,對於系統而言負擔也更輕(相對第一種辦法)。

以下是windows下TCP keepalive設置的函數:

[cpp]  view plain  copy
 
 print?
  1. /*@author super bert 2014-12-16*/  
  2. /*socket TCP保持長連接函數*/  
  3. int socket_tcp_alive(int socket)  
  4. {  
  5.     int ret = 0;  
  6.   
  7.     int keep_alive = 1;    
  8.     ret = setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&keep_alive, sizeof(keep_alive));    
  9.   
  10.     if (ret == SOCKET_ERROR)    
  11.     {  
  12.         printf("setsockopt failed: %d \n", WSAGetLastError());  
  13.         return -1;    
  14.     }  
  15.   
  16.     struct tcp_keepalive in_keep_alive = {0};  
  17.     unsigned long ul_in_len = sizeof(struct tcp_keepalive);  
  18.     struct tcp_keepalive out_keep_alive = {0};  
  19.     unsigned long ul_out_len = sizeof(struct tcp_keepalive);  
  20.     unsigned long ul_bytes_return = 0;  
  21.   
  22.     in_keep_alive.onoff = 1;                    /*打開keepalive*/  
  23.     in_keep_alive.keepaliveinterval = 5000; /*發送keepalive心跳時間間隔-單位為毫秒*/  
  24.     in_keep_alive.keepalivetime = 1000;         /*多長時間沒有報文開始發送keepalive心跳包-單位為毫秒*/  
  25.   
  26.     ret = WSAIoctl(socket, SIO_KEEPALIVE_VALS, (LPVOID)&in_keep_alive, ul_in_len,   
  27.                           (LPVOID)&out_keep_alive, ul_out_len, &ul_bytes_return, NULL, NULL);  
  28.   
  29.     if (ret == SOCKET_ERROR)    
  30.     {    
  31.         printf("WSAIoctl failed: %d \n", WSAGetLastError());    
  32.         return -1;    
  33.     }   
  34.   
  35.     return 0;  
  36. }  

 

需要#include <mstcpip.h>頭文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM