• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            TCP連接非正常斷開的檢測

            Posted on 2010-12-29 10:38 S.l.e!ep.¢% 閱讀(1876) 評論(0)  編輯 收藏 引用 所屬分類: NetWorkepoll

            TCP連接非正常斷開的檢測

            如果主機崩潰,write是否阻塞取決于內核的tcp緩沖區,但read將一直阻塞,直到超時ETIMEOUT,或由于某些中間路由器的原因返回EHOSTUNREACH/ENETUNREACH。select不能檢測到該情況。
            如果主機崩潰并重起,客戶的write到達主機時主機響應RST,客戶的read將返ECONNRESET。





            此處的”非正常斷開”指TCP連接不是以優雅的方式斷開,如網線故障等物理鏈路的原因,還有突然主機斷電等原因
            有兩種方法可以檢測:1.TCP連接雙方定時發握手消息 2.利用TCP協議棧中的KeepAlive探測
            第二種方法簡單可靠,只需對TCP連接兩個Socket設定KeepAlive探測,所以本文只講第二種方法在Linux,Window2000下的實現(在其它的平臺上沒有作進一步的測試)
            Windows 2000平臺下
            C++代碼 復制代碼
            1. //定義結構及宏 ??
            2. struct?TCP_KEEPALIVE?{ ??
            3. u_longonoff; ??
            4. u_longkeepalivetime; ??
            5. u_longkeepaliveinterval; ??
            6. }?; ??
            7. #define?SIO_KEEPALIVE_VALS?_WSAIOW(IOC_VENDOR,4) ??
            8. //KeepAlive實現 ??
            9. TCP_KEEPALIVE?inKeepAlive?=?{0};?//輸入參數 ??
            10. unsigned?long?ulInLen?=?sizeof(TCP_KEEPALIVE); ??
            11. TCP_KEEPALIVE?outKeepAlive?=?{0};?//輸出參數 ??
            12. unsigned?long?ulOutLen?=?sizeof(TCP_KEEPALIVE); ??
            13. unsigned?long?ulBytesReturn?=?0; ??
            14. //設置socket的keep?alive為5秒,并且發送次數為3次 ??
            15. inKeepAlive.onoff?=?1; ??
            16. inKeepAlive.keepaliveinterval?=?5000;?//兩次KeepAlive探測間的時間間隔 ??
            17. inKeepAlive.keepalivetime?=?5000;?//開始首次KeepAlive探測前的TCP空閉時間 ??
            18. if?(WSAIoctl((unsigned?int)s,?SIO_KEEPALIVE_VALS, ??
            19. (LPVOID)&inKeepAlive,?ulInLen, ??
            20. (LPVOID)&outKeepAlive,?ulOutLen, ??
            21. &ulBytesReturn,?NULL,?NULL)?==?SOCKET_ERROR) ??
            22. { ??
            23. ACE_DEBUG?((LM_INFO, ??
            24. ACE_TEXT?("(%P|%t)?\WSAIoctl?failed.?error?code(%d)!\n"),WSAGetLastError())); ??
            25. }??


            Linux平臺下
            C++代碼 復制代碼
            1. #include ??
            2. …… ??
            3. ////KeepAlive實現 ??
            4. //下面代碼要求有ACE,如果沒有包含ACE,則請把用到的ACE函數改成linux相應的接口 ??
            5. int?keepAlive?=?1;//設定KeepAlive ??
            6. int?keepIdle?=?5;//開始首次KeepAlive探測前的TCP空閉時間 ??
            7. int?keepInterval?=?5;//兩次KeepAlive探測間的時間間隔 ??
            8. int?keepCount?=?3;//判定斷開前的KeepAlive探測次數 ??
            9. if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive))?==?-1) ??
            10. { ??
            11. ACE_DEBUG?((LM_INFO, ??
            12. ACE_TEXT?("(%P|%t)?setsockopt?SO_KEEPALIVE?error!\n"))); ??
            13. } ??
            14. if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void?*)&keepIdle,sizeof(keepIdle))?==?-1) ??
            15. { ??
            16. ACE_DEBUG?((LM_INFO, ??
            17. ACE_TEXT?("(%P|%t)?setsockopt?TCP_KEEPIDLE?error!\n"))); ??
            18. } ??
            19. if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void?*)&keepInterval,sizeof(keepInterval))?==?-1) ??
            20. { ??
            21. ACE_DEBUG?((LM_INFO, ??
            22. ACE_TEXT?("(%P|%t)?setsockopt?TCP_KEEPINTVL?error!\n"))); ??
            23. } ??
            24. if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void?*)&keepCount,sizeof(keepCount))?==?-1) ??
            25. { ??
            26. ACE_DEBUG?((LM_INFO, ??
            27. ACE_TEXT?("(%P|%t)setsockopt?TCP_KEEPCNT?error!\n"))); ??
            28. }??
            国产精品久久久天天影视| 三级片免费观看久久| 久久99热狠狠色精品一区| 久久久亚洲欧洲日产国码二区| 青青草原精品99久久精品66| 91精品国产乱码久久久久久| 99久久夜色精品国产网站| 久久精品国产亚洲AV香蕉| 91精品国产综合久久婷婷| 久久精品无码专区免费| 久久午夜羞羞影院免费观看| 无码人妻少妇久久中文字幕 | 久久国产精品国产自线拍免费| 99久久婷婷国产综合精品草原| 97精品伊人久久大香线蕉| 一本久久a久久精品综合夜夜| 久久久久高潮综合影院| 久久精品中文字幕有码| 亚洲成色999久久网站| 日本强好片久久久久久AAA| 一级做a爰片久久毛片看看| 天天久久狠狠色综合| 无码8090精品久久一区| AA级片免费看视频久久| 久久国产热精品波多野结衣AV| 国内精品九九久久久精品| 久久热这里只有精品在线观看| 国产精品久久久久久久午夜片 | 久久久久免费精品国产| 国内精品久久久久久中文字幕| 99久久精品日本一区二区免费| 免费久久人人爽人人爽av| 日日狠狠久久偷偷色综合96蜜桃| 国内精品久久久久影院网站 | 精品久久久久久久久中文字幕| 18岁日韩内射颜射午夜久久成人| 亚洲婷婷国产精品电影人久久| 色综合久久久久综合99| 麻豆久久久9性大片| 亚洲欧美成人综合久久久| 色偷偷久久一区二区三区|