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

   C++ 技術(shù)中心

   :: 首頁 :: 聯(lián)系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

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

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

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

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

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


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

alive_in.keepaliveinterval 
= 1000// 兩次KeepAlive探測間的時(shí)間間隔

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選項(xiàng)之后,對于使用IOCP模型的服務(wù)器端程序來說,一旦檢測到連接斷開,GetQueuedCompletionStatus函數(shù)將立即返回FALSE,使得服務(wù)器端能及時(shí)清除該連接、釋放該連接相關(guān)的資源。對于使用select模型的客戶端來說,連接斷開被探測到時(shí),以recv目的阻塞在socket上的select方法將立即返回SOCKET_ERROR,從而得知連接已失效,客戶端程序便有機(jī)會及時(shí)執(zhí)行清除工作、提醒用戶或重新連接。

 

另一種技術(shù),由應(yīng)用程序自己發(fā)送心跳包來檢測連接的健康性。客戶端可以在一個(gè)Timer中或低級別的線程中定時(shí)向發(fā)服務(wù)器發(fā)送一個(gè)短小精悍的包,并等待服務(wù)器的回應(yīng)。客戶端程序在一定時(shí)間內(nèi)沒有收到服務(wù)器回應(yīng)即認(rèn)為連接不可用,同樣,服務(wù)器在一定時(shí)間內(nèi)沒有收到客戶端的心跳包則認(rèn)為客戶端已經(jīng)掉線。


 

 

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

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

有兩種方法可以檢測:

1.TCP連接雙方定時(shí)發(fā)握手消息


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


Windows 2000平臺下 頭文件
#include 
<mstcpip.h>
//定義結(jié)構(gòu)及宏
/*

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

    tcp_keepalive live,liveout; 
    live.keepaliveinterval=5000; //每5秒發(fā)一次探測報(bào)文,發(fā)5次沒有回應(yīng),就斷開
    live.keepalivetime=30000;//超過30s沒有數(shù)據(jù),就發(fā)送控測包
    
    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;
//在測試過程中,發(fā)現(xiàn)檢測的次數(shù)是5次,即下面的設(shè)置中,從最近一次消息開始計(jì)算的10秒后,每次間隔5秒,連續(xù)發(fā)送5次,即35秒發(fā)現(xiàn)網(wǎng)絡(luò)斷了
tcp_keepalive live,liveout;
live.keepaliveinterval=5000; //每次檢測的間隔 (單位毫秒)
live.keepalivetime=10000; //第一次開始發(fā)送的時(shí)間(單位毫秒)
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實(shí)現(xiàn),單位秒
//下面代碼要求有ACE,如果沒有包含ACE,則請把用到的ACE函數(shù)改成linux相應(yīng)的接口
int keepAlive = 1;//設(shè)定KeepAlive
int keepIdle = 5;//開始首次KeepAlive探測前的TCP空閉時(shí)間
int keepInterval = 5;//兩次KeepAlive探測間的時(shí)間間隔
int keepCount = 3;//判定斷開前的KeepAlive探測次數(shù)
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++技術(shù)中心 閱讀(6646) 評論(1)  編輯 收藏 引用 所屬分類: Windows 網(wǎng)絡(luò)編程

Feedback

# re: tcp連接探測Keepalive和心跳包 2013-08-15 08:41 永遇樂
學(xué)習(xí)了  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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ⅴ蜜桃女| 久久综合久久综合久久综合| 国产亚洲欧美日韩精品| 亚洲欧美日韩精品一区二区| 亚洲精品久久久久久久久| 美女视频黄 久久| 尤妮丝一区二区裸体视频| 久久久久久久一区| 欧美自拍偷拍| 亚洲精品免费网站| 亚洲精品国产精品国产自| 欧美激情第二页| 亚洲美女精品一区| 亚洲精品日韩精品| 欧美日韩一区二区三区| 亚洲图片在线观看| 亚洲伊人色欲综合网| 国产精品系列在线| 久久久久免费观看| 久久女同精品一区二区| 亚洲国产cao| 亚洲日本久久| 欧美日韩国产亚洲一区| 亚洲欧美日本日韩| 欧美一级成年大片在线观看| 韩国三级电影久久久久久| 亚洲国产精品一区二区第一页 | 欧美日韩免费观看中文| 国产日韩亚洲欧美精品| 国产欧美欧洲在线观看| 久久精品99| 免费日韩精品中文字幕视频在线| 亚洲人屁股眼子交8| 欧美三级乱码| 亚洲永久免费视频| 久久国产精品久久久| 亚洲国产精品va在线看黑人动漫| 亚洲国产一区二区精品专区| 国产精品久久久久久久久久免费看| 久久久久久久久久久成人| 欧美国产欧美亚州国产日韩mv天天看完整| 99精品视频免费| 亚洲欧美综合| 亚洲美女精品一区| 久久爱www.| avtt综合网| 久久福利电影| 中文精品99久久国产香蕉| 性色一区二区三区| 中文亚洲欧美| 亚洲国产成人在线视频| 国产美女在线精品免费观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美日韩免费一区二区三区视频| 欧美一区三区二区在线观看| 免费中文字幕日韩欧美| 久久av二区| 欧美精品一区在线| 久热综合在线亚洲精品| 欧美体内she精视频| 国产精品久久久久久久7电影| 久久精品国产999大香线蕉| 久久www成人_看片免费不卡| 亚洲图片你懂的| 欧美激情免费在线| 麻豆成人在线| 国产日韩欧美在线播放| 9国产精品视频| 亚洲人成在线免费观看| 久久久久在线| 久久国产毛片| 国产精品萝li| 99精品视频免费观看视频| 亚洲精品日产精品乱码不卡| 久久精品夜色噜噜亚洲a∨| 欧美亚洲免费| 国产精品成人在线| 亚洲人体一区| 欧美激情精品久久久久久蜜臀| 久久精品视频免费观看| 国产精品视屏| 日韩视频在线播放| 亚洲美女在线看| 欧美va天堂va视频va在线| 免费h精品视频在线播放| 国产真实久久| 久久久亚洲高清| 嫩草影视亚洲| 亚洲日本va午夜在线电影| 欧美xx69| 亚洲精品久久久久久久久久久久久 | 欧美亚洲一区二区在线| 欧美激情第三页| 亚洲精品黄色| 久久久噜噜噜久噜久久| 欧美日韩亚洲一区在线观看| 日韩一区二区免费高清| 99精品视频网| 欧美另类久久久品| 亚洲美女区一区| 亚洲亚洲精品在线观看| 国产精品免费小视频| 亚洲影院色在线观看免费| 久久国产精品亚洲va麻豆| 尤物精品国产第一福利三区| 欧美国产日韩a欧美在线观看| 亚洲性感美女99在线| 国产精品夜色7777狼人| 欧美亚洲系列| 欧美aⅴ99久久黑人专区| 亚洲精品在线三区| 欧美日韩亚洲视频一区| 午夜精品久久一牛影视| 六月天综合网| 夜久久久久久| 国产欧美91| 免费日韩av| 亚洲一二三四区| 毛片av中文字幕一区二区| 亚洲人成在线播放| 狠狠色狠狠色综合日日91app| 久久综合九色九九| 亚洲美女黄色| 久久久久久一区二区三区| 日韩午夜电影| 国产一区二区三区丝袜| 欧美国产日韩一区二区在线观看 | 国产精品夜夜夜一区二区三区尤| 午夜影视日本亚洲欧洲精品| 欧美韩日一区二区| 午夜精品亚洲| 亚洲乱码一区二区| 国外成人免费视频| 美女黄色成人网| 亚洲一区观看| 亚洲电影在线观看| 久久国产乱子精品免费女| 欧美日产一区二区三区在线观看 | 亚洲一区二区av电影| 亚洲乱码精品一二三四区日韩在线 | 亚洲人成网站999久久久综合| 快射av在线播放一区| 99视频精品| 久久午夜精品一区二区| 一本色道久久综合亚洲精品按摩 | 影音先锋日韩资源| 欧美性感一类影片在线播放 | 亚洲福利视频网站| 国产精品久久久久久久久久三级| 欧美成人午夜剧场免费观看| 久久精品亚洲乱码伦伦中文| 夜夜嗨av色一区二区不卡| 久久精品国产欧美激情| 亚洲国产精品一区二区尤物区 | 亚洲一区二区三区777| 欧美激情视频一区二区三区不卡| 欧美一区二区三区婷婷月色 | 久久欧美中文字幕| 亚洲系列中文字幕| 一区二区动漫| 亚洲伦伦在线| 欧美成人精品| 鲁大师影院一区二区三区| 性欧美暴力猛交另类hd| 亚洲一区二区精品| 中文一区二区| 一本久道久久综合婷婷鲸鱼| 亚洲精品乱码| 日韩视频在线观看免费| 日韩视频久久| 欧美成人中文字幕| 猛男gaygay欧美视频| 久久婷婷国产综合国色天香| 久久久999| 国产精品色午夜在线观看| 亚洲人久久久| 一区二区三区精品在线| 中文日韩在线| 亚洲先锋成人| 香蕉av福利精品导航| 性感少妇一区| 久久久成人网| 久久综合九色九九| 欧美激情aⅴ一区二区三区| 欧美国产激情| 欧美日韩午夜视频在线观看| 欧美视频免费在线| 欧美日韩国产精品自在自线| 国产精品福利在线观看网址| 国产精品你懂得| 狠狠久久婷婷| 亚洲美女黄色| 亚洲一区久久久| 久久不射中文字幕| 六月婷婷一区| 欧美激情精品久久久六区热门|