日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tcp连接探测Keepalive和心跳包

發布時間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tcp连接探测Keepalive和心跳包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
采用TCP連接的C/S模式軟件,連接的雙方在連接空閑狀態時,如果任意一方意外崩潰、當機、網線斷開或路由器故障,另一方無法得知TCP連接已經失效,除非繼續在此連接上發送數據導致錯誤返回。很多時候,這不是我們需要的。我們希望服務器端和客戶端都能及時有效地檢測到連接失效,然后優雅地完成一些清理工作并把錯誤報告給用戶。 如何及時有效地檢測到一方的非正常斷開,一直有兩種技術可以運用。一種是由TCP協議層實現的Keepalive,另一種是由應用層自己實現的心跳包。 TCP默認并不開啟Keepalive功能,因為開啟Keepalive功能需要消耗額外的寬帶和流量,盡管這微不足道,但在按流量計費的環境下增加了費用,另一方面,Keepalive設置不合理時可能會因為短暫的網絡波動而斷開健康的TCP連接。并且,默認的Keepalive超時需要7,200,000 milliseconds,即2小時,探測次數為5次。
對于Win2K/XP/2003,可以從下面的注冊表項找到影響整個系統所有連接的keepalive參數: [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters] "KeepAliveTime”=dword:006ddd00 "KeepAliveInterval"=dword:000003e8? "MaxDataRetries"="5"
對于實用的程序來說,2小時的空閑時間太長。因此,我們需要手工開啟Keepalive功能并設置合理的Keepalive參數。
// 開啟KeepAlive BOOL bKeepAlive = TRUE; int nRet = ::setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet == SOCKET_ERROR)
{
??? return FALSE;
}
// 設置KeepAlive參數 tcp_keepalive alive_in = {0}; tcp_keepalive alive_out = {0}; alive_in.keepalivetime = 5000; // 開始首次KeepAlive探測前的TCP空閉時間
alive_in.keepaliveinterval = 1000; // 兩次KeepAlive探測間的時間間隔
alive_in.onoff = TRUE; unsigned long ulBytesReturn = 0;
nRet = WSAIoctl(socket_handle, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in), &alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL); if (nRet == SOCKET_ERROR) { ? ? return FALSE; }

開啟Keepalive選項之后,對于使用IOCP模型的服務器端程序來說,一旦檢測到連接斷開,GetQueuedCompletionStatus函數將立即返回FALSE,使得服務器端能及時清除該連接、釋放該連接相關的資源。對于使用select模型的客戶端來說,連接斷開被探測到時,以recv目的阻塞在socket上的select方法將立即返回SOCKET_ERROR,從而得知連接已失效,客戶端程序便有機會及時執行清除工作、提醒用戶或重新連接。
另一種技術,由應用程序自己發送心跳包來檢測連接的健康性。客戶端可以在一個Timer中或低級別的線程中定時向發服務器發送一個短小精悍的包,并等待服務器的回應。客戶端程序在一定時間內沒有收到服務器回應即認為連接不可用,同樣,服務器在一定時間內沒有收到客戶端的心跳包則認為客戶端已經掉線。

++++++++++++++++++++++++++++++++++++++++++++++++++
windows下此處的”非正常斷開”指TCP連接不是以優雅的方式斷開,如網線故障等物理鏈路的原因,還有突然主機斷電等原因.
有兩種方法可以檢測:
1.TCP連接雙方定時發握手消息
2.利用TCP協議棧中的KeepAlive探測

第二種方法簡單可靠,只需對TCP連接兩個Socket設定KeepAlive探測, 所以本文只講第二種方法在Linux,Window2000下的實現(在其它的平臺上沒有作進一步的測試)

Windows 2000平臺下 頭文件 #include <mstcpip.h> //定義結構及宏 /* struct TCP_KEEPALIVE { ? ? u_long onoff; ? ? u_long keepalivetime; ? ? u_long keepaliveinterval; } ; */
? ? tcp_keepalive live,liveout; ? ? ? live.keepaliveinterval=5000; //每5秒發一次探測報文,發5次沒有回應,就斷開 ? ? live.keepalivetime=30000;//超過30s沒有數據,就發送控測包 ? ?? ? ? live.onoff=TRUE; ? ? ? int Opt = 1; ? ? int iRet = setsockopt(Accept,SOL_SOCKET,SO_KEEPALIVE,(char *)&Opt,sizeof(int)); ? ? ? if(iRet == 0) ? ? { ? ? ? ? ?DWORD dw; ? ? ? ? ?if(::WSAIoctl(Accept,SIO_KEEPALIVE_VALS, ? ? ? ? ? &live,sizeof(live),&liveout,sizeof(liveout), ? ? ? ? ? &dw,NULL,NULL)== SOCKET_ERROR){ ? ? ?} ? }


ACE下代碼 //by rainfish blog.csdn.net/bat603

?
int Opt = 1; //在測試過程中,發現檢測的次數是5次,即下面的設置中,從最近一次消息開始計算的10秒后,每次間隔5秒,連續發送5次,即35秒發現網絡斷了 tcp_keepalive live,liveout;? live.keepaliveinterval=5000; //每次檢測的間隔 (單位毫秒) live.keepalivetime=10000; //第一次開始發送的時間(單位毫秒) live.onoff=TRUE;? int iRet = stream.set_option(SOL_SOCKET,SO_KEEPALIVE,&Opt,sizeof(int));? if(iRet == 0) {? ? ? DWORD dw; ? ? //此處顯示了在ACE下獲取套接字的方法,即句柄的(SOCKET)化就是句柄 ? ? if(WSAIoctl((SOCKET)h,SIO_KEEPALIVE_VALS,&live,sizeof(live), ? ? ? ? &liveout,sizeof(liveout),&dw,NULL,NULL)== SOCKET_ERROR) ? ? { ? ? ? ? //Delete Client? ? ? ? ? return;? ? ? }? }
Linux平臺下
#include "/usr/include/linux/tcp.h" #include "/usr/include/linux/socket.h" KeepAlive實現,單位秒 //下面代碼要求有ACE,如果沒有包含ACE,則請把用到的ACE函數改成linux相應的接口 int keepAlive = 1;//設定KeepAlive int keepIdle = 5;//開始首次KeepAlive探測前的TCP空閉時間 int keepInterval = 5;//兩次KeepAlive探測間的時間間隔 int keepCount = 3;//判定斷開前的KeepAlive探測次數 if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1) { ? ? ACE_DEBUG ((LM_INFO, ? ? ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!/n"))); }
if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1) { ? ? ACE_DEBUG ((LM_INFO, ? ? ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!/n"))); }
if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1) { ? ? ACE_DEBUG ((LM_INFO, ? ? ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!/n"))); }
if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1) { ? ? ACE_DEBUG ((LM_INFO, ? ? ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!/n"))); }

總結

以上是生活随笔為你收集整理的tcp连接探测Keepalive和心跳包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品自拍偷拍 | 国产一区一一区高清不卡 | 女人扒开腿免费视频app | 亚洲欧美另类在线视频 | 日韩av资源在线观看 | 日韩精品第1页 | 成人午夜影视在线观看 | 国产成人免费片在线观看 | 日本黄色特级片 | 久久曰视频 | 韩国三级视频 | 国产一区二区三区黄 | 饥渴少妇色诱水电工 | 女人17片毛片60分钟 | 另类综合小说 | 精品久久免费观看 | 日本熟妇一区二区三区 | 日韩中文字幕精品 | 成人性生交大片 | 色偷偷资源 | 熟女俱乐部一区二区视频在线 | 99这里都是精品 | 国模大尺度自拍 | 亚洲av无码一区二区三区人妖 | 色老大影院 | 国产婷婷综合 | 99国产精品99久久久久久 | 亚洲精品国产欧美 | 天天视频色 | 最新中文字幕久久 | 一级国产视频 | 潘金莲黄色一级片 | 最新超碰在线 | 妖精视频在线观看免费 | 日韩免费一级 | 大j8黑人w巨大888a片 | tube日本69第一次 | 日韩伊人 | 亚州av网站 | 久久高清av| 91精品国自产在线偷拍蜜桃 | 韩国一级片在线观看 | 国产亚洲精品久久久久动 | avtt在线观看 | 日韩免费精品视频 | 天堂在线中文8 | 黄色高清网站 | 18成人免费观看网站 | 亚洲免费在线看 | 91视频在线看 | 国产又粗又猛又爽又黄的视频一 | 伦理片一区二区 | 永久免费看片 | 女人久久久 | 三级av片 | 日本天堂网在线观看 | www视频免费在线观看 | 爱的色放韩国电影 | 男人透女人免费视频 | 妞干网这里只有精品 | 国产毛片毛片毛片毛片 | 欧美日韩国产图片 | 欧美国产第一页 | 97影视 | av第一页 | 黄色日本网站 | 免费成人在线观看 | 久久久免费精品视频 | 麻豆一区产品精品蜜桃的特点 | 欧美性受xxxx黑人猛交88 | 免费看的av片 | 亚洲天堂av电影 | 欧美日韩a v| 成人区人妻精品一熟女 | 亚洲黄v| 黄色欧美网站 | 狠狠操网 | 天天干狠狠爱 | 成人黄色小说视频 | a级黄色一级片 | 好色综合 | 久久久97 | 色综合久久久久久久 | jizz性欧美2| 高清一区二区三区 | 午夜香蕉网 | 啪啪无遮挡 | 国产精品免费一区二区三区四区 | 极品少妇一区二区 | 日韩av电影手机在线观看 | 99国产精品无码 | 中文乱码人妻一区二区三区视频 | 欧美中文字幕在线播放 | 日本高清不卡码 | 欧美第七页 | 高清av免费 | 91精品国产乱码久久久 | 亚洲欧美日韩综合一区二区 | 一级黄色片在线观看 |