SOCKET 檢測連結是否斷線的三種方法(轉載)
下面我就上面的三種方法來做一下介紹。
(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#中操作Word(8)—— 向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