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

面對現實,超越自己
逆水行舟,不進則退
posts - 269,comments - 32,trackbacks - 0

       采用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中或低級別的線程中定時向發服務器發送一個短小精悍的包,并等待服務器的回應。客戶端程序在一定時間內沒有收到服務器回應即認為連接不可用,同樣,服務器在一定時間內沒有收到客戶端的心跳包則認為客戶端已經掉線。

 

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

 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")));
}

 

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


本文轉自:http://m.shnenglu.com/API/archive/2013/08/13/202516.html

 

posted on 2013-08-14 19:14 王海光 閱讀(1241) 評論(0)  編輯 收藏 引用 所屬分類: C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲专区一区| 国产亚洲永久域名| 亚洲欧洲99久久| 亚洲欧美日韩在线观看a三区| 亚洲亚洲精品在线观看 | 狠狠色香婷婷久久亚洲精品| 韩国欧美国产1区| 亚洲国产一区二区精品专区| 亚洲美女av在线播放| 亚洲午夜在线观看视频在线| 欧美在线视频免费播放| 欧美阿v一级看视频| 亚洲伦理网站| 欧美亚洲在线播放| 免费成人你懂的| 国产精品久久国产精品99gif| 国产午夜精品视频| 99天天综合性| 久久久国产一区二区| 亚洲丰满在线| 在线亚洲欧美| 久久免费高清| 西西人体一区二区| 亚洲一区二区三区高清不卡| 9久草视频在线视频精品| 亚洲国产精品va| 亚洲人午夜精品免费| 最新国产拍偷乱拍精品| 亚洲中午字幕| 亚洲欧美久久| 亚洲欧美国产高清va在线播| 亚洲影院色无极综合| 久久久久国产成人精品亚洲午夜| 欧美大片在线看| 一本一本久久a久久精品牛牛影视| 欧美一区二区啪啪| 欧美日韩美女在线| 在线成人黄色| 亚洲欧美国产77777| 欧美激情久久久| 亚洲欧美日韩综合aⅴ视频| 欧美日本亚洲韩国国产| 亚洲高清自拍| 久久天天狠狠| 欧美一区二区三区在线看| 国产精品久久久久久妇女6080 | 欧美一区二区免费| 欧美四级在线| 99在线热播精品免费| 免费观看成人网| 久久精品国产96久久久香蕉| 国产精品一区免费在线观看| 亚洲香蕉网站| 亚洲美女视频网| 欧美国产综合一区二区| 亚洲国产影院| 欧美激情在线| 欧美成人国产一区二区| 亚洲国产第一页| 欧美激情视频一区二区三区在线播放 | 亚洲国产精品精华液2区45| 久久精品亚洲| 永久免费精品影视网站| 噜噜噜躁狠狠躁狠狠精品视频| 欧美在线三级| 激情欧美日韩一区| 免费永久网站黄欧美| 免费亚洲一区二区| 亚洲国产欧美一区二区三区丁香婷| 欧美激情国产高清| 久久精品国产一区二区三区| 国产日韩欧美高清| 狂野欧美激情性xxxx欧美| 欧美在线亚洲在线| 精品va天堂亚洲国产| 欧美91精品| 欧美精品亚洲| 香蕉乱码成人久久天堂爱免费| 亚洲一区国产精品| 国产一区二区日韩| 欧美激情第1页| 欧美午夜在线| 久久久.com| 蜜桃精品久久久久久久免费影院| 亚洲美女淫视频| 亚洲一区视频| 亚洲国产成人在线播放| 亚洲精选大片| 国产精品永久在线| 农村妇女精品| 欧美日韩国产综合一区二区| 性欧美暴力猛交另类hd| 久久精品99无色码中文字幕 | 久久精品国产2020观看福利| 亚洲国产精品第一区二区三区| 亚洲欧洲日产国产网站| 国产精品乱码一区二区三区| 欧美a级大片| 欧美日韩精品久久久| 久久九九热免费视频| 欧美激情一区二区三级高清视频 | 国产精品大片| 免费在线亚洲欧美| 国产精品久久久久久久9999 | 伊人婷婷久久| 一本色道久久88精品综合| 一区二区亚洲| 一区二区日韩欧美| 亚洲欧洲在线看| 欧美一级视频免费在线观看| 中国成人在线视频| 欧美成人免费va影院高清| 久久久亚洲一区| 国产精品久久夜| 亚洲韩国日本中文字幕| 激情欧美一区二区三区| 亚洲一区二区三区四区五区午夜| 91久久精品美女高潮| 欧美自拍偷拍| 欧美一区国产在线| 国产精品国产三级国产专区53| 亚洲高清免费| 精品电影在线观看| 欧美在线日韩精品| 久久国产精品99国产精| 国产精品久久久久一区二区三区| 亚洲欧美日韩人成在线播放| 国产精品国产三级国产普通话99| 西西裸体人体做爰大胆久久久| 欧美a级一区二区| 亚洲午夜久久久久久久久电影院 | 亚洲香蕉视频| 激情综合色综合久久综合| 国产亚洲精品久| 国产精品高清一区二区三区| 国产精品青草久久| 国产欧美va欧美va香蕉在| 亚洲激情成人| 韩国av一区二区三区四区| 国产精品裸体一区二区三区| 欧美小视频在线| 欧美精品色综合| 欧美午夜女人视频在线| 免费观看日韩| 久久婷婷影院| 欧美在线日韩精品| 免费观看在线综合| 男人的天堂亚洲| 亚洲第一福利在线观看| 毛片av中文字幕一区二区| 中文日韩在线视频| 国产精品亚洲美女av网站| 一本色道婷婷久久欧美| 亚洲欧美日本日韩| 亚洲激情影视| 久久久免费精品视频| 欧美a一区二区| 国产精品一区二区三区久久| 欧美在线亚洲在线| 亚洲综合色在线| 欧美激情一区二区三区高清视频 | 欧美黄色网络| 一区二区欧美亚洲| 午夜亚洲性色视频| 亚洲美女精品久久| 国产日韩精品在线| 久久精品国产第一区二区三区最新章节| 久久精品欧洲| 欧美中文字幕第一页| 亚洲精品视频在线看| 国产伦精品一区二区三区| 亚洲欧美日韩综合一区| 亚洲第一黄色| 久久久久久综合| 在线一区欧美| 免费观看日韩av| 欧美在线观看视频| 国产精品久久久久秋霞鲁丝| 亚洲精品免费在线| 亚洲免费成人av电影| 亚洲免费观看高清在线观看| 欧美 日韩 国产 一区| 欧美一级淫片aaaaaaa视频| 欧美一区二区三区喷汁尤物| 亚洲手机成人高清视频| 欧美精品久久一区二区| 日韩一级免费| 欧美xx视频| 国模私拍一区二区三区| 免费人成精品欧美精品| 男女激情久久| 香蕉久久一区二区不卡无毒影院| 亚洲一区成人| 午夜久久久久久| 久久精品日韩欧美| 老司机精品福利视频| 欧美日本高清| 亚洲在线1234| 亚洲性夜色噜噜噜7777| 裸体女人亚洲精品一区|