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

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            如何探測socket是否保持SO_KEEPALIVE??

            Posted on 2009-02-03 11:06 Prayer 閱讀(4226) 評論(0)  編輯 收藏 引用 所屬分類: SOCKET
            一個客戶端通過交換機連接了多個服務(wù)器,如果一個服務(wù)器出了問題,客戶端如何快速知道那個連接已經(jīng)斷開了?我嘗試使用了setsockopt,將socket設(shè)置為so_keepalive,雖然返回值顯示設(shè)置成功了,但并不起作用,請問有什么解決辦法??
            答:SO_KEEPALIVE是有周期的,當然不會因為SO_KEEPALIVE就能馬上檢測蛭斷開了。
            答:客戶端和服務(wù)器都面對這個問題當對方以外吊線,本地無法得知,這個問題的普遍方法是發(fā)送心跳信息,TCP是可靠的,發(fā)送心跳信息失敗表示連接已經(jīng)斷開,覺得對的話給我點分
            答:心跳包是常用的方法~~~
            答:我用SO_KEEPALIVE等了十分鐘都沒反應(yīng),怎么調(diào)整周期?心跳包是什么東西,能否說的詳細些?
            答:所謂心跳包是客戶端和服務(wù)器之間進行的一種連接測試使用的數(shù)據(jù)包,是用戶自定義的一種數(shù)據(jù),數(shù)據(jù)是封裝在TCP協(xié)議中作為數(shù)據(jù)凈核部分的,事實上是一種應(yīng)用協(xié)議。內(nèi)容可以為空,在包頭部分設(shè)置相應(yīng)的字段,在服務(wù)器端收到數(shù)據(jù)包之后檢查包頭,包頭如果是心跳包類型,則說明該socket連接的客戶端在線,而客戶端則是定時發(fā)送這樣的數(shù)據(jù)包,例如1分鐘一次。可以設(shè)置服務(wù)器驗證心跳數(shù)據(jù)的超時時間為3分鐘,也就是說如果連續(xù)的3個心跳包服務(wù)器收不到,則判斷客戶端已經(jīng)斷開!
            答:設(shè)置這些東西需要在連接之前,還是在連接之后,還是兩者皆可?
            答:這些設(shè)置是在程序設(shè)計的時候用的,事實上心跳包是程序員在設(shè)計程序的時候自己設(shè)置的,心跳包是ip數(shù)據(jù)包中的數(shù)據(jù)凈核部分,和普通的數(shù)據(jù)傳輸一樣,只是在傳輸?shù)搅硪欢藭r,需要接受端判斷數(shù)據(jù)類型,是需要處理的事務(wù)數(shù)據(jù),還是心跳數(shù)據(jù),這需要程序設(shè)計者在設(shè)計程序的時候?qū)?shù)據(jù)協(xié)議進行自定義設(shè)置,說穿了就是自己定義一套應(yīng)用層的協(xié)議。簡單舉例:對于客戶端connect之后可以啟動一個定時器,定時為1分鐘,客戶端正常發(fā)送各種事務(wù)數(shù)據(jù),定義數(shù)據(jù)格式¦數(shù)據(jù)頭¦數(shù)據(jù)長度¦數(shù)據(jù)內(nèi)容¦當計時器到1分鐘時,客戶端向服務(wù)器發(fā)送一個數(shù)據(jù)長度為零,內(nèi)容為空的數(shù)據(jù),假定正常事務(wù)數(shù)據(jù)的數(shù)據(jù)頭為值為1~255,則可以定義心跳包數(shù)據(jù)頭的值為0,即發(fā)送一個¦0¦0¦¦這樣一個數(shù)據(jù)。當服務(wù)器收到客戶端連接之后也啟動一個計時器,這時可能有多個客戶端連接,需要輪詢各個連接的計時器,當計時器超過3分鐘,則判斷該連接斷開,對于有效連接,當它數(shù)據(jù)之后,解析數(shù)據(jù),先讀數(shù)據(jù)頭,當數(shù)據(jù)頭值為1~255可以轉(zhuǎn)入相關(guān)的處理過程,當收到數(shù)據(jù)頭值為0的時候要將計時器歸0,重新計時。
            答:一個客戶端通過交換機連接了多個服務(wù)器,這種情況根據(jù)socket事件已經(jīng)不大可靠了,尤其是大負荷服務(wù)器,比如msn,qq,skype等,通常斷開一分鐘以上才通知到,這就是采用心跳才檢測的。而且如果是UDP連接的話,也只能心跳檢測。方法如樓上說的,還可以簡化一下:每隔10秒(間隔時間可以自己設(shè)置)向服務(wù)器查詢一下,返回值正常就表示在線,設(shè)數(shù)器清0。如果沒有返回或返回值異常,計數(shù)加1。連接三次沒收到返回值就說明掉線了。
            答:上面方法有個問題要自己處理好:UDP是面向無連接的,所以收方要對數(shù)據(jù)進行排序,避免先處理后到的數(shù)據(jù)。
            久久久久久综合网天天| 久久久久久久久久免免费精品 | 日本加勒比久久精品| 久久无码国产| 狠狠色丁香婷婷综合久久来| 久久高清一级毛片| 久久婷婷五月综合色高清| 99热精品久久只有精品| 伊人久久综合精品无码AV专区| 97久久超碰国产精品旧版| 亚洲国产婷婷香蕉久久久久久| 国内精品久久久久久野外| 国内精品伊人久久久久777| 精品无码久久久久久久动漫| 无码日韩人妻精品久久蜜桃| 久久久久亚洲精品中文字幕| 久久综合中文字幕| 999久久久无码国产精品| 精品久久久久久久国产潘金莲| 大香网伊人久久综合网2020| 九九久久自然熟的香蕉图片| 国产精品美女久久福利网站| 久久国产精品一区| 93精91精品国产综合久久香蕉| aaa级精品久久久国产片| 亚洲色欲久久久综合网| 少妇人妻综合久久中文字幕| 青青草国产97免久久费观看| 青青青青久久精品国产h久久精品五福影院1421 | 国产亚洲色婷婷久久99精品| 亚洲国产精品成人久久| 亚洲中文字幕无码久久2017| 国色天香久久久久久久小说| 久久精品卫校国产小美女| 亚洲AV无码久久精品蜜桃| 午夜精品久久久久久久| 久久青青草原亚洲av无码app| 精产国品久久一二三产区区别| 国产69精品久久久久9999APGF| 伊人久久大香线蕉av不卡| WWW婷婷AV久久久影片|