• <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.¢%

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

            TCP連接非正常斷開的檢測

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

            TCP連接非正常斷開的檢測

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





            此處的”非正常斷開”指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平臺下
            C++代碼 復(fù)制代碼
            1. //定義結(jié)構(gòu)及宏 ??
            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實(shí)現(xiàn) ??
            9. TCP_KEEPALIVE?inKeepAlive?=?{0};?//輸入?yún)?shù) ??
            10. unsigned?long?ulInLen?=?sizeof(TCP_KEEPALIVE); ??
            11. TCP_KEEPALIVE?outKeepAlive?=?{0};?//輸出參數(shù) ??
            12. unsigned?long?ulOutLen?=?sizeof(TCP_KEEPALIVE); ??
            13. unsigned?long?ulBytesReturn?=?0; ??
            14. //設(shè)置socket的keep?alive為5秒,并且發(fā)送次數(shù)為3次 ??
            15. inKeepAlive.onoff?=?1; ??
            16. inKeepAlive.keepaliveinterval?=?5000;?//兩次KeepAlive探測間的時(shí)間間隔 ??
            17. inKeepAlive.keepalivetime?=?5000;?//開始首次KeepAlive探測前的TCP空閉時(shí)間 ??
            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++代碼 復(fù)制代碼
            1. #include ??
            2. …… ??
            3. ////KeepAlive實(shí)現(xiàn) ??
            4. //下面代碼要求有ACE,如果沒有包含ACE,則請把用到的ACE函數(shù)改成linux相應(yīng)的接口 ??
            5. int?keepAlive?=?1;//設(shè)定KeepAlive ??
            6. int?keepIdle?=?5;//開始首次KeepAlive探測前的TCP空閉時(shí)間 ??
            7. int?keepInterval?=?5;//兩次KeepAlive探測間的時(shí)間間隔 ??
            8. int?keepCount?=?3;//判定斷開前的KeepAlive探測次數(shù) ??
            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. }??
            色欲综合久久躁天天躁蜜桃| 久久人人添人人爽添人人片牛牛| 免费一级欧美大片久久网| 久久久久久久久久久久中文字幕| 久久久久久精品免费免费自慰| 大美女久久久久久j久久| 93精91精品国产综合久久香蕉 | 久久亚洲国产午夜精品理论片| 无码人妻久久一区二区三区| 久久人妻无码中文字幕| 久久伊人五月丁香狠狠色| 国产精品美女久久福利网站| 久久久久久久97| 久久久久久国产精品免费无码| 久久夜色精品国产噜噜麻豆| 久久精品麻豆日日躁夜夜躁| 久久精品亚洲中文字幕无码麻豆| 国产精品一区二区久久国产| 91精品观看91久久久久久| 18岁日韩内射颜射午夜久久成人| www亚洲欲色成人久久精品| 精品久久久久久无码免费| 久久久久亚洲精品男人的天堂| 性做久久久久久久久久久| 久久久久久曰本AV免费免费| 久久人人爽人人爽人人AV东京热| 精品无码久久久久国产| 国产69精品久久久久99| 中文精品99久久国产| 亚洲va久久久噜噜噜久久男同| 久久久久久狠狠丁香| 日韩电影久久久被窝网| 亚洲AV无码1区2区久久| 国产精品久久久久AV福利动漫| 国产亚洲精午夜久久久久久| 亚洲美日韩Av中文字幕无码久久久妻妇| 中文字幕热久久久久久久| 精品精品国产自在久久高清| 欧美久久久久久| 青青草原综合久久| 久久久www免费人成精品|