• <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.¢% 閱讀(1880) 評論(0)  編輯 收藏 引用 所屬分類: NetWork 、epoll

            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. }??
            久久久久久国产精品无码超碰| 午夜精品久久久久久久无码| 中文字幕精品久久久久人妻| 91超碰碰碰碰久久久久久综合| 久久亚洲精品成人av无码网站| 久久精品中文字幕大胸| 久久久久综合中文字幕| 99久久99久久精品国产| 久久精品国产亚洲Aⅴ香蕉| 欧美激情精品久久久久| 91性高湖久久久久| 久久国产精品免费一区二区三区| 国产成人AV综合久久| 久久久久18| 偷窥少妇久久久久久久久| 亚洲欧美日韩中文久久| 久久99精品久久久久久久不卡 | 一本色道久久HEZYO无码| 2021国产精品午夜久久 | 久久久久久亚洲精品成人| 精品久久8x国产免费观看| 国产亚洲欧美成人久久片| 精品久久久无码中文字幕天天| 人人狠狠综合88综合久久| 无码国内精品久久人妻蜜桃 | 久久久久一区二区三区| 国产精品成人精品久久久| 久久久久久国产a免费观看黄色大片 | 狠狠色丁香婷婷久久综合五月| 伊人久久大香线蕉av一区| 久久精品视频免费| 久久精品国产欧美日韩99热| 精品国产91久久久久久久| 久久人人爽人人爽AV片| 国产亚洲精久久久久久无码| 久久综合五月丁香久久激情| 久久久久亚洲av无码专区| 久久久噜噜噜久久| 久久综合九色综合久99| 青青草原精品99久久精品66| 久久久久久国产精品无码下载 |