linux下socket連接下的心跳機制

1,在長連接下,有可能很長一段時間都沒有數據往來

理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節點出現什么故障是難以知道的。

有的節點(防火墻)會自動把一定時間之內沒有數據交互的連接給斷掉。

在這個時候,就需要我們的心跳包了,用于維持長連接,保活

2,心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活著。事實上這是為了保持長連接,至于這個包的內容,是沒有什么特別規定的,不過一般都是很小的包,或者只包含包頭的一個空包。心跳包主要也就是用于長連接的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。


3,下面為封裝好的心跳包函數,加入項目中參數設置一下即可

[cpp] view plain copy print?
  1. #include?<netinet/tcp.h>????
  2. //參數解釋 ??
  3. //fd:網絡連接描述符??
  4. //start:首次心跳偵測包發送之間的空閑時間????
  5. ?//interval:兩次心跳偵測包之間的間隔時間???
  6. //count:探測次數,即將幾次探測失敗判定為TCP斷開??
  7. int?set_tcp_keepAlive(int?fd,?int?start,?int?interval,?int?count)?????
  8. {?????
  9. ????int?keepAlive?=?1;?????
  10. ????if?(fd?<?0?||?start?<?0?||?interval?<?0?||?count?<?0)?return?-1;???//入口參數檢查?,編程的好習慣。??
  11. ????//啟用心跳機制,如果您想關閉,將keepAlive置零即可?????
  12. ????if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive))?==?-1)?????
  13. ????{?????
  14. ????????perror("setsockopt");?????
  15. ????????return?-1;?????
  16. ????}?????
  17. ????//啟用心跳機制開始到首次心跳偵測包發送之間的空閑時間?????
  18. ????if(setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void?*)&start,sizeof(start))?==?-1)?????
  19. ????{?????
  20. ????????perror("setsockopt");?????
  21. ????????return?-1;?????
  22. ????}?????
  23. ????//兩次心跳偵測包之間的間隔時間?????
  24. ????if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void?*)&interval,sizeof(interval))?==?-1)?????
  25. ????{?????
  26. ????????perror("setsockopt");?????
  27. ????????return?-1;?????
  28. ????}?????
  29. ????//探測次數,即將幾次探測失敗判定為TCP斷開?????
  30. ????if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void?*)&count,sizeof(count))?==?-1)?????
  31. ????{?????
  32. ????????perror("setsockopt");?????
  33. ????????return?-1;?????
  34. ????}?????
  35. ????return?0;?????
  36. }???
?
將想設置的參數傳入該函數,設置成功返回0,否則返回-1。設置成功以后,可以將fd交給select去監聽可讀可寫事件,如果select檢測到fd可讀且read返回錯誤(<0),一般就能判定該fd對應的TCP連接已經異常斷開,調用close函數將fd關閉即可。


TCP連接非正常斷開的檢測(KeepAlive探測)

此處的”非正常斷開”指TCP連接不是以優雅的方式斷開,如網線故障等物理鏈路的原因,還有突然主機斷電等原因

有兩種方法可以檢測:1.TCP連接雙方定時發握手消息 2.利用TCP協議棧中的KeepAlive探測

第二種方法簡單可靠,只需對TCP連接兩個Socket設定KeepAlive探測。

心跳機制只是做檢查,并不能處理

從而得知連接已失效,客戶端程序便有機會及時執行清除工作、提醒用戶或重新連接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253113.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大力智能臺燈與飛利浦臺燈 智能調光功能體驗

目前市面上絕大部分智能臺燈幾乎都宣稱有自動調光功能&#xff0c;即臺燈隨環境光變化自動調節LED光的亮度&#xff0c;或者臺燈在固定環境光下&#xff0c;一旦開啟了自動調光模式LED燈將自動調光至一個最適合讀寫作業的亮度&#xff1b; 下面對比體驗了大力臺燈T6 和 飛利浦…

php-驗證碼

<html><body> <h2>用戶注冊&#xff1a;</h2> <br> <form action"a.php" method"post"> 賬 號&#xff1a;<input type"text" name"zh" id""> <br> 密 碼&#xff1a;&l…

Linux內核Socket參數調優

可調優的內核變量存在兩種主要接口&#xff1a;sysctl命令和/proc文件系統&#xff0c;proc中與進程無關的所有信息都被移植到sysfs中。IPV4協議棧的sysctl參數主要是sysctl.net.core、sysctl.net.ipv4&#xff0c;對應的/proc文件系統是/proc/sys/net/ipv4和/proc/sys/net/cor…

Mango 的組織重構

為了提高敏捷性&#xff0c;企業應將自己劃分為一些負責業務戰略計劃價值中心&#xff0c;承擔端到端的責任&#xff0c;并完全獲取有關客戶需求的信息。企業需要為員工營造可交叉協作的空間&#xff0c;可以學習和使用自組織的改進圈、實踐社群&#xff08;CoP&#xff0c;Com…

vue.js單頁面應用實例

一&#xff1a;npm的安裝由于新版的node.js已經集成了npm的環境&#xff0c;所以只需去官網下載node.js并安裝&#xff0c;安裝完成后使用cmd檢測是否成功。測試node的版本號&#xff1a;node -v測試npm的版本號&#xff1a;npm -v以上提示代表安裝成功二&#xff1a;vue.js環境…

大屏拼接控制器的發展歷程與現狀分析

【中國數字視聽網訊】在大屏幕拼接系統中&#xff0c;我們很容易將焦點聚集在拼接單元上&#xff0c;殊不知幕后還有一個英雄在默默的支持&#xff0c;這個英雄就是是拼接控制器。拼接控制器的優劣直接決定著整個大屏幕顯示系統效果的好與壞&#xff0c;也決定了整套顯示系統的…

AA級與AAA級臺燈 重要指標對比

讀寫作業臺燈&#xff0c;按照國家標準&#xff08;GB/T 9473-2017 讀寫作業臺燈性能要求 &#xff09;臺燈只有兩個等級 即為A級和AA級&#xff1a; 但是大家在各個購物網站挑選臺燈尤其是挑選孩子學習用的讀寫臺燈時&#xff0c;會發現很多廠家宣稱臺 燈為AAA級&#xff0c…

windbg調試相關命令

windbg查找函數:x exe!main*條件斷點打印字符&#xff1a;bp 7199a2b0 ".printf \"message:%ma\", poi(esp8);.echo;g"//搜索內存:s -a 0000000000780000 L8000000 "This is a test2"!address,可以查看進程的堆布局&#xff0c;堆屬性。!addre…

零基礎學python,看完這篇文章,你的python基礎就差不多了!干貨【1】

2019獨角獸企業重金招聘Python工程師標準>>> Python基礎語法和面向對象&#xff08;下一篇分享面向對象&#xff09; Python基礎語法 1. 認識Python 1.1 Python 簡介 Python 的創始人為吉多范羅蘇姆&#xff08;Guido van Rossum&#xff09;。 Python 的設計目標&a…

消費類電子認證測試資料清單

消費類電子上市前必須取得相關認證&#xff0c;其中最常見的有3C、SRRC和CTA等強制性認證&#xff0c;還有類似TUV和Rohs等自愿性認證&#xff0c;現將常見認證測試資料清單小結如下&#xff1a; CCC測試認證&#xff1a; 測試項&#xff1a;EMC、安規和隨機等。 SRRC核準&am…

SVG 相關整理

1. 中文參考手冊&#xff1a; http://www.runoob.com/svg/svg-reference.html SVG HTML5 資源教程 http://www.html5tricks.com/tag/svg/ 2.SVG 入門到精通 http://www.w3cplus.com/blog/tags/411.html 3.SVG開發包整理 http://www.oschina.net/project/tag/420/svg http://www…

液晶拼接控制器

液晶拼接墻系統是由液晶拼接顯示單元、液晶拼接支架、液晶拼接控制器器和信號源組合而成的。液晶拼接控制器則是液晶拼接系統的重要組成部分。 液晶拼接控制器一般分為兩種&#xff1a;內置嵌入式液晶拼接器、外置液晶拼接控制器。 內置嵌入式液晶拼接器 內置嵌入式液晶拼接器只…

03-類與對象——課后動手動腦

1.早期我們經常這樣定義變量 int value100&#xff1b; 前面的示例中這樣定義變量 MyClass obj new MyClass(); 這兩種方式定義的變量是一樣的嗎&#xff1f; 這兩種方式定義的變量是一樣的&#xff0c;因為它們都是類的實例化&#xff0c;只是第一種是一個簡便的寫法&#xf…

IPython 使用記錄

記錄使用的一些技巧處理 1 自動重載修改的文件 局部的會話中使用 如果想在當前 ipython 會話中使用&#xff0c;則運行 ipython 后&#xff0c;依次鍵入下面語句即可 %load_ext autoreload %autoreload 2 全局使用如果想為了懶省事&#xff0c;我希望 IPython 一直會自動重載&a…

有道智能學習燈 初體驗

有道詞典筆在業內樹立了一個標桿&#xff0c;自認為有道出品必須精品&#xff01; 但是今天剛初步體驗了一下有道智能學習燈&#xff0c;硬件方面說實話有點意外&#xff0c;猜測這應該不是有道詞典 筆團隊打造的硬件產品吧。 現在將個人體驗感受表格化陳述如下&#xff1a;…

視頻處理器

http://baike.baidu.com/link?url9Ql-myLXWgFtt8ItgnYe1suvbqU57tivB8WwTVHqNqGWKNQqgvkQ7uqYrw22I44LO-LCmjQuKAk-SGGWV8di4_

centos忘記root用戶的密碼

方法&#xff1a; 1.在開機啟動的時候快速按鍵盤上的“E”鍵 或者“ESC”鍵&#xff08;如果做不到精準快速可以在啟動前一直按著或者不停的按&#xff09;&#xff0c;會進入如下界面。如果你的有多個操作系統就會出現多個內核&#xff0c;就會出現多個選項 2. 選擇你忘記密碼…

MySql(18)——Linux MySQL主從配置

MySQL 主從配置 Author:xushuyi 參照技術&#xff1a;http://www.cnblogs.com/kevingrace/p/6256603.html 1. 主從數據庫 1、主庫&#xff1a;192.168.56.100 2、從庫&#xff1a;192.168.56.102 3、創建主從數據庫一定要保證主從數據庫字符集編碼的一致性&#xff0c;否則主從…

linux之PHY

一.結構體 1.PHY設備 [cpp]view plaincopy struct phy_device { struct phy_driver *drv; //PHY設備驅動 struct mii_bus *bus; //對應的MII總線 struct device dev; //設備文件 u32 phy_id; //PHY ID enum phy_state state; //PHY狀態 …

元器件 失效分析 過程介紹

硬件產品在使用過程中&#xff0c;常常會出現功能失效的情況。排除裝配異常的話&#xff0c;功能失效一般是電路可能出現故障&#xff0c;具體可能是某個元器件損壞了。需要研發及時分析定位故障原因及時改善排除故障&#xff0c;尤其是在試產階段&#xff0c;顯得十分重要&…