青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術中心

   :: 首頁 :: 聯系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

      采用TCP連接的C/S模式軟件,連接的雙方在連接空閑狀態時,如果任意一方意外崩潰、當機、網線斷開或路由器故障,另一方無法得知TCP連接已經失效,除非繼續在此連接上發送數據導致錯誤返回。很多時候,這不是我們需要的。我們希望服務器端和客戶端都能及時有效地檢測到連接失效,然后優雅地完成一些清理工作并把錯誤報告給用戶。
      如何及時有效地檢測到一方的非正常斷開,一直有兩種技術可以運用。一種是由TCP協議層實現的Keepalive,另一種是由應用層自己實現的心跳包
      TCP默認并不開啟Keepalive功能,因為開啟Keepalive功能需要消耗額外的寬帶和流量,盡管這微不足道,但在按流量計費的環境下增加了費用,另一方面,Keepalive設置不合理時可能會因為短暫的網絡波動而斷開健康的TCP連接。并且,默認的Keepalive超時需要7,200,000 milliseconds,即2小時,探測次數為5次。
      對于Win2K/XP/2003,可以從下面的注冊表項找到影響整個系統所有連接的keepalive參數:
       [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters]
        "KeepAliveTime”=dword:006ddd00
        "KeepAliveInterval"=dword:000003e8 
        "MaxDataRetries"="5"

      對于實用的程序來說,2小時的空閑時間太長。因此,我們需要手工開啟Keepalive功能并設置合理的Keepalive參數。
// 開啟KeepAlive
BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));

if (nRet == SOCKET_ERROR)
{
return FALSE;
}


// 設置KeepAlive參數
tcp_keepalive alive_in = {0};
tcp_keepalive alive_out 
= {0};
alive_in.keepalivetime 
= 5000// 開始首次KeepAlive探測前的TCP空閉時間

alive_in.keepaliveinterval 
= 1000// 兩次KeepAlive探測間的時間間隔

alive_in.onoff 
= TRUE;
unsigned 
long ulBytesReturn = 0;

nRet 
= WSAIoctl(socket_handle, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
&alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);
if (nRet == SOCKET_ERROR)
{
return FALSE;


}



開啟Keepalive選項之后,對于使用IOCP模型的服務器端程序來說,一旦檢測到連接斷開,GetQueuedCompletionStatus函數將立即返回FALSE,使得服務器端能及時清除該連接、釋放該連接相關的資源。對于使用select模型的客戶端來說,連接斷開被探測到時,以recv目的阻塞在socket上的select方法將立即返回SOCKET_ERROR,從而得知連接已失效,客戶端程序便有機會及時執行清除工作、提醒用戶或重新連接。

 

另一種技術,由應用程序自己發送心跳包來檢測連接的健康性。客戶端可以在一個Timer中或低級別的線程中定時向發服務器發送一個短小精悍的包,并等待服務器的回應??蛻舳顺绦蛟谝欢〞r間內沒有收到服務器回應即認為連接不可用,同樣,服務器在一定時間內沒有收到客戶端的心跳包則認為客戶端已經掉線。


 

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 windows下此處的”非正常斷開”指TCP連接不是以優雅的方式斷開,如網線故障等物理鏈路的原因,還有突然主機斷電等原因.

有兩種方法可以檢測:

1.TCP連接雙方定時發握手消息


2.利用TCP協議棧中的KeepAlive探測
第二種方法簡單可靠,只需對TCP連接兩個Socket設定KeepAlive探測,
所以本文只講第二種方法在Linux,Window2000下的實現(在其它的平臺上沒有作進一步的測試)


Windows 2000平臺下 頭文件
#include 
<mstcpip.h>
//定義結構及宏
/*

struct TCP_KEEPALIVE {
u_longonoff;
u_longkeepalivetime;
u_longkeepaliveinterval;
}
 ;
*/

    tcp_keepalive live,liveout; 
    live.keepaliveinterval=5000; //每5秒發一次探測報文,發5次沒有回應,就斷開
    live.keepalivetime=30000;//超過30s沒有數據,就發送控測包
    
    live.onoff=TRUE; 
    int Opt = 1;
    int iRet = setsockopt(Accept,SOL_SOCKET,SO_KEEPALIVE,(char *)&Opt,sizeof(int)); 
    if(iRet == 0){
     DWORD dw;
     if(::WSAIoctl(Accept,SIO_KEEPALIVE_VALS,
      &live,sizeof(live),&liveout,sizeof(liveout),
      &dw,NULL,NULL)== SOCKET_ERROR){
     } 
    }






ACE下代碼 //by rainfish blog.csdn.net/bat603

int Opt = 1;
//在測試過程中,發現檢測的次數是5次,即下面的設置中,從最近一次消息開始計算的10秒后,每次間隔5秒,連續發送5次,即35秒發現網絡斷了
tcp_keepalive live,liveout;
live.keepaliveinterval=5000; //每次檢測的間隔 (單位毫秒)
live.keepalivetime=10000; //第一次開始發送的時間(單位毫秒)
live.onoff=TRUE;
int iRet = stream.set_option(SOL_SOCKET,SO_KEEPALIVE,&Opt,sizeof(int));
if(iRet == 0){
DWORD dw;
//此處顯示了在ACE下獲取套接字的方法,即句柄的(SOCKET)化就是句柄
if(WSAIoctl((SOCKET)h,SIO_KEEPALIVE_VALS,&live,sizeof(live),
&liveout,sizeof(liveout),&dw,NULL,NULL)== SOCKET_ERROR){
//Delete Client
return;
}
}


Linux平臺下


#include "/usr/include/linux/tcp.h"
#include "/usr/include/linux/socket.h"
////KeepAlive實現,單位秒
//下面代碼要求有ACE,如果沒有包含ACE,則請把用到的ACE函數改成linux相應的接口
int keepAlive = 1;//設定KeepAlive
int keepIdle = 5;//開始首次KeepAlive探測前的TCP空閉時間
int keepInterval = 5;//兩次KeepAlive探測間的時間間隔
int keepCount = 3;//判定斷開前的KeepAlive探測次數
if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!/n")));
}

if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!/n")));
}

if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!/n")));
}

if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!/n")));
}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

posted on 2013-08-13 09:03 C++技術中心 閱讀(6646) 評論(1)  編輯 收藏 引用 所屬分類: Windows 網絡編程

Feedback

# re: tcp連接探測Keepalive和心跳包 2013-08-15 08:41 永遇樂
學習了  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            女人天堂亚洲aⅴ在线观看| 国产精品最新自拍| 91久久午夜| 欧美在线1区| 亚洲乱码国产乱码精品精天堂 | 久久精品av麻豆的观看方式| 日韩午夜三级在线| 影音先锋亚洲电影| 在线观看欧美激情| 国产精品vvv| 欧美特黄一级| 欧美大片免费| 欧美福利一区二区| 欧美在线欧美在线| 在线视频欧美日韩| 亚洲自拍偷拍色片视频| 亚洲国产日韩在线一区模特| 午夜一区二区三区不卡视频| 亚洲一区二区三区在线| 99精品欧美| 亚洲伊人网站| 性欧美videos另类喷潮| 久久福利视频导航| 亚洲第一主播视频| 亚洲一区二区久久| 久久久综合网站| 国产精品久久久久9999吃药| 尤妮丝一区二区裸体视频| 99在线精品视频| 麻豆久久婷婷| 亚洲永久网站| 欧美福利在线观看| 精品88久久久久88久久久| 亚洲午夜免费福利视频| 久久亚洲私人国产精品va媚药| 亚洲欧洲日韩在线| 欧美一区二区三区男人的天堂| 欧美激情在线狂野欧美精品| 国产主播一区二区三区四区| 亚洲图片欧美日产| 欧美黄在线观看| 欧美专区一区二区三区| 欧美日韩伦理在线| 亚洲精品久久久久久久久| 久久黄色影院| 亚洲在线视频一区| 欧美成人自拍视频| 韩国福利一区| 欧美一区二区三区免费看| 亚洲人成网站在线观看播放| 久久av资源网| 国产亚洲精品成人av久久ww| 亚洲已满18点击进入久久| 亚洲国产视频直播| 欧美 日韩 国产一区二区在线视频 | 国产一区二区三区黄| 亚洲婷婷国产精品电影人久久| 欧美激情一区二区三区| 久久久免费观看视频| 国产在线精品一区二区中文| 欧美在线观看视频在线| 亚洲视频日本| 国产欧美精品日韩区二区麻豆天美| 亚洲一区二区三区影院| 日韩西西人体444www| 欧美日韩卡一卡二| 亚洲一区二区四区| 亚洲一级黄色片| 国产欧美一区二区精品性| 欧美一区三区二区在线观看| 香蕉亚洲视频| 一区二区三区在线免费播放| 麻豆成人综合网| 欧美高清视频在线| 一区二区三区日韩在线观看| 99精品欧美一区二区蜜桃免费| 欧美视频国产精品| 久久国产视频网| 久久综合影视| 99综合电影在线视频| 在线一区二区三区做爰视频网站 | 亚洲色图制服丝袜| 99这里有精品| 国产综合亚洲精品一区二| 欧美www视频| 欧美体内谢she精2性欧美| 久久av最新网址| 麻豆成人综合网| 一区二区三区欧美亚洲| 性欧美办公室18xxxxhd| 亚洲国产91色在线| 亚洲天堂黄色| 伊人久久婷婷| 99日韩精品| 亚洲第一视频网站| 中日韩男男gay无套| 激情欧美日韩一区| 中文久久乱码一区二区| 亚洲盗摄视频| 午夜精品电影| 一本一本久久a久久精品综合妖精| 亚洲男人第一网站| 日韩亚洲欧美在线观看| 欧美伊人久久| 亚洲小少妇裸体bbw| 久久久噜噜噜久久| 午夜视频在线观看一区二区| 美女精品一区| 久久久久www| 国产精品成人免费| 欧美激情按摩| 黄色国产精品| 亚洲中无吗在线| 亚洲精品久久久久久久久久久久久| 国产精品99久久久久久www| 亚洲黄色性网站| 欧美在线观看视频一区二区三区| 亚洲一级高清| 欧美日韩一区三区| 亚洲成人在线免费| 欧美日一区二区在线观看| 蜜臀a∨国产成人精品| 国产精品久久久久久久久婷婷| 欧美大片在线影院| 在线观看精品视频| 久久国产天堂福利天堂| 欧美一乱一性一交一视频| 欧美日韩免费高清| 亚洲精品国产无天堂网2021| 亚洲人在线视频| 欧美v亚洲v综合ⅴ国产v| 另类天堂视频在线观看| 国产亚洲综合性久久久影院| 亚洲尤物在线| 久久精品盗摄| 久久久国产一区二区三区| 国产精品久久久久久久久久ktv | 国产精品久久久久影院色老大| 免费亚洲婷婷| 精品成人国产在线观看男人呻吟| 午夜精品亚洲一区二区三区嫩草| 一区二区三区欧美视频| 欧美日韩视频在线一区二区| 亚洲福利视频一区| 亚洲欧洲一区二区天堂久久| 久久资源在线| 男同欧美伦乱| 亚洲国产精品成人综合色在线婷婷| 久久久久久69| 亚洲国产成人久久综合| 亚洲黄色毛片| 欧美精品在线极品| 在线亚洲国产精品网站| 久久国产福利| 欧美成人中文字幕| 亚洲久久一区| 久久成人一区| 亚洲高清在线精品| 欧美激情一区二区三区蜜桃视频| 亚洲电影免费观看高清完整版在线观看| 亚洲人成在线影院| 欧美精品自拍偷拍动漫精品| 一区二区免费看| 欧美一级大片在线免费观看| 国产亚洲精品久久久久婷婷瑜伽| 久久久久久国产精品一区| 欧美一区国产在线| 伊甸园精品99久久久久久| 欧美电影美腿模特1979在线看| 亚洲电影视频在线| 夜夜夜久久久| 国产婷婷色一区二区三区四区| 亚洲欧美激情视频在线观看一区二区三区| 欧美一区二区三区在线播放| 亚洲激情在线视频| 欧美视频精品在线观看| 性久久久久久久久久久久| 欧美成人免费网| aaa亚洲精品一二三区| 欧美日韩午夜激情| 久久久综合网| 亚洲欧美另类中文字幕| 免费成人美女女| 一本一本久久a久久精品综合麻豆| 欧美美女福利视频| 久久精品成人一区二区三区蜜臀| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩在线播放三区四区| 欧美在线日韩精品| 日韩一区二区久久| 蜜臀91精品一区二区三区| 午夜视频在线观看一区| 亚洲日本成人| 国产亚洲人成网站在线观看| 欧美精品麻豆| 欧美xx69| 老牛嫩草一区二区三区日本| 亚洲一区二区三区午夜| 亚洲欧洲在线一区| 欧美bbbxxxxx|