1. 程式人生 > >SOCKET 檢測連結是否斷線的三種方法(轉載)

SOCKET 檢測連結是否斷線的三種方法(轉載)

   目前主要有三種方法來實現使用者掉線檢測:SO_KEEPALIVE ,SIO_KEEPALIVE_VALS 和Heart-Beat執行緒。
下面我就上面的三種方法來做一下介紹。
(1)SO_KEEPALIVE 機制
        這是socket庫提供的功能,設定介面是setsockopt API:
   BOOL bSet=TRUE;
   setsockopt(hSocket,SOL_SOCKET,SO_KEEPALIVE,(const char*)&bSet,sizeof(BOOL));

       根據MSDN的文件,如果為socket設定了KEEPALIVE選項,TCP/IP棧在檢測到對方掉線後,
   任何在該socket上進行的呼叫(傳送/接受呼叫)就會立刻返回,錯誤號是WSAENETRESET ;
   同時,此後的任何在該socket控制代碼的呼叫會立刻失敗,並返回WSAENOTCONN錯誤。

   該機制的缺點也很明顯:
         預設設定是空閒2小時才傳送一個“保持存活探測分節”,不能保證實時檢測!
   當然也可以修改時間間隔引數,但是會影響到所有開啟此選項的套介面!
         關聯了完成埠的socket可能會忽略掉該套接字選項。


(2)SIO_KEEPALIVE_VALS 機制
         這是從彭博兄那裡學到一個機制拉,設定介面是WSAIoctl API:
     DWORD dwError = 0L ;
     tcp_keepalive sKA_Settings = {0}, sReturned = {0} ;
     sKA_Settings.onoff = 1 ;
     sKA_Settings.keepalivetime = 5500 ; // Keep Alive in 5.5 sec.
     sKA_Settings.keepaliveinterval = 3000 ; // Resend if No-Reply
     if (WSAIoctl(skNewConnection, SIO_KEEPALIVE_VALS, &sKA_Settings,
          sizeof(sKA_Settings), &sReturned, sizeof(sReturned), &dwBytes,
          NULL, NULL) != 0)
     {
           dwError = WSAGetLastError() ;
     }
     實現時需要新增tcp_keepalive and SIO_KEEPALIVE_VALS的定義檔案MSTCPiP.h
     該選項不同於SO_KEEPALIVE 機制的就是它是針對單個連線的,對系統其他的套接
     口並不影響。
        針對完成埠的socket,設定了SIO_KEEPALIVE_VALS後,啟用包由TCP STACK來負責。
     當網路連線斷開後,TCP STACK並不主動告訴上層的應用程式,但是當下一次RECV或者SEND操作
     進行後,馬上就會返回錯誤告訴上層這個連線已經斷開了.如果檢測到斷開的時候,在這個連線
     上有正在PENDING的IO操作,則馬上會失敗返回.


     該機制的缺點:
             不通用啦。MS的API只能用於Windows拉。不過,呵呵用彭博兄的評論就是:
     優雅一些^_^.
    
(3)Heart-Beat執行緒
        沒說的。自己寫一個後臺執行緒,實現Heart-Beat包,客戶端受到該包後,立刻返回相應的反饋 包。

    該方法的好處是通用,但缺點就是會改變現有的通訊協議!

相關推薦

SOCKET 檢測連結是否方法轉載

   目前主要有三種方法來實現使用者掉線檢測:SO_KEEPALIVE ,SIO_KEEPALIVE_VALS 和Heart-Beat執行緒。下面我就上面的三種方法來做一下介紹。(1)SO_KEEPALIVE 機制        這是socket庫提供的功能,設定介面是setsockopt API:   BO

Linux下執行時呼叫動態連結庫.so的方法筆記

在/etc/ld.so.conf.d/下建立xxx.conf,在文字中加入.so所在路徑,如:/usr/xxx等等,然後使用相應ldconfig命令使之生效。 將.so所在路徑新增為LD_LIBRARY_PATH環境變數。 在編譯命令中使用-Wl,-rpath

SOCKET 檢測連結是否方法

目前主要有三種方法來實現使用者掉線檢測:SO_KEEPALIVE ,SIO_KEEPALIVE_VALS 和Heart-Beat執行緒。 下面我就上面的三種方法來做一下介紹。 (1)SO_KEEPALIVE 機制         這是socket庫提供的功能,設定介面是se

ubuntu下安裝程序的方法

安裝nagios -s 需要 ibm 查詢 gin make this www. 引言 在Ubuntu當中,安裝應用程序我所知道的有三種方法,分別是apt-get,dpkg安裝deb和make install安裝源碼包三種。下面針對每一種方法各舉例來說明。 一、apt-

Stack的含義轉載

理解這個概念,對於理解程式的執行至關重要。容易混淆的是,這個詞其實有三種含義,適用於不同的場合,必須加以區分。含義一:資料結構stack的第一種含義是一組資料的存放方式,特點為LIFO,即後進先出(Last in, first out)。在這種資料結構中,資料像積木那樣一層層堆起來,後面加入的資料

java中從鍵盤輸入的方法

java中從鍵盤輸入的三種方法,轉發原文https://blog.csdn.net/u012249177/article/details/49586383 import java.io.BufferedReader; import java.io.IOException; import

js 數組去重的方法unique

arr 個數 func () 方法 表數 undefined 唯一性 當前 方法一: Array.prototype.unique=function(){   var arr=[];//新建一個臨時數組   for(var i=0;i<this.length;i

【Linux Is Not Unix】虛擬機器下CentOS配置ip方法1-橋接模式bridge

  在bridged模式下,VMWare虛擬出來的作業系統就像是區域網中的一臺獨立的主機,它可以訪問網內任何一臺機器。在bridged模式下,你需要手工為虛擬系統配置IP地址、子網掩碼,而且還要和宿

資料歸一化及方法python

資料標準化(歸一化)處理是資料探勘的一項基礎工作,不同評價指標往往具有不同的量綱和量綱單位,這樣的情況會影響到資料分析的結果,為了消除指標之間的量綱影響,需要進行資料標準化處理,以解決資料指標之間的可比性。原始資料經過資料標準化處理後,各指標處於同一數量級,適合進行綜合對比評價。以下是三種常用的歸一化方法:m

C#中操作Word8—— 向Word中插入圖表的方法

一、 前言         本文主要介紹向word中插入圖表的方法。方法共有三種,每一種都有自己的適用範圍和利弊。介紹之前,我們準備實驗用的文件,做一個如下圖所示的word模板,我們要做的的是在這個名叫chart的書籤中插入一個圖表,下面然後我將逐一進行介紹這三種方法:

java保留兩位小數4方法轉載

cal AI maximum 保留兩位小數 tps 控制 .text int .html 喵喵最近經常遇到小數點保留的問題,轉載一篇Java裏面的幾種小數點位數控制方法。 這是轉載的原地址:https://www.cnblogs.com/chenrenshui/p/6128

詳解Java解析XML的四方法轉載

出處:http://developer.51cto.com/art/200903/117512.htm XML現在已經成為一種通用的資料交換格式,它的平臺無關性,語言無關性,系統無關性,給資料整合與互動帶來了極大的方便。對於XML本身的語法知識與技術細節,需要閱讀相關的技術文獻,這裡

動態連結DLL總結---DLL除錯8

DLL有三種除錯方法:        方法1:                 如果動態連結庫是自己編寫的,並且測試程式碼也是自己編寫的,那麼此時我們可以將動態連結庫和測試程式碼的工程建立在一起,在除錯測試程式碼的時候,可以直接呼叫動態連結庫中的程式碼。 我們在測試連結庫

建立圖的方法鄰接矩陣+鄰接表+十字連結串列

一、鄰接矩陣 採用矩陣的方式來描述圖中的連線各非連線關係,若不能連上用無窮大或者0來表示,但是如果邊很稀少,頂點很多,那麼將會有很大的浪費。同時,這個矩陣可以同時刻畫有向圖和無向圖,無向圖就是把有向圖根據對角線對稱即可。 1、思想:建立一個結構體,它包含

sql92查詢與sql99查詢實現的方式講義

--SQL92&SQL99實現三表聯合查詢 --建立city表:使用圖形操作即可 --給city表新增測試資料 insert into city values(1,'商丘','歷史聞名古都'); insert into city values(2,'邯鄲','歷史聞名

關於LIST擴容的方式轉載自https://blog.csdn.net/wt122694/article/details/81173128

int[] arr2=new int[arr1.length*2] //新陣列長度 for(int i=0;i<arr1.length;i++){ //複製 arr2[i]=arr1[i]; }  

JAVA:定時器的方法詳細註解

第一種:         建立一個thread,然後讓它在while迴圈裡一直執行著,通過sleep方法來達到定時任務的效果,程式碼如下: public class Task1 { public static void main(String[] args) { /

兩欄佈局方法親測有效

第一種: 只需要兩個div就能實現,主要原理是將第一個div設為浮動,並加上寬度,然後就可以實現兩欄佈局,並不需要設定第二個div的任何東西。程式碼如下: div{ height:500px; } #aside{

JavaScript中this關鍵字改變指向的方法apply、call、bind

首先,瞭解一下this關鍵字。this關鍵字就涉及到函式呼叫的內容。函式的幾種呼叫方式: 普通函式呼叫 作為方法來呼叫 作為建構函式來呼叫 使用apply/call方法來呼叫 Function.prototype.bind方法 ES6箭頭函式 但是不管

迴歸模型中殘差的形式

原文:https://baijiahao.baidu.com/s?id=1581878577084855837&wfr=spider&for=pc 殘差分析是迴歸診斷的方向之一。迴歸分析中常用的殘差有三種,分別為普通殘差、標準化殘差和學生化殘差。 1. 普通殘差(residu