socket KeepAlive 使用筆記

2021-04-06 19:34:39 字數 1004 閱讀 9837

1.問題

最近碰到的乙個問題,socket連線一台伺服器後,如果無資料通訊,伺服器會在幾分鐘後關閉socket。由此產生乙個問題。與伺服器進行連線後,拔掉網線,幾分鐘後,由於伺服器已經關閉socket,但客戶這邊還認為已經連線的是正確的socket。因此產生一些操作上的延遲問題。

2.分析

由於伺服器已經關閉的客戶端的連線,所以客戶端也得關閉超時的連線。因此我選用keepalive方法來定時的探測網路是否存在。如果伺服器3分鐘關閉socket,那客戶端只要稍小於3分鐘探測一次就可以了。

如果keepalive探測失敗,那就可以用select語句捕獲到socket需要read,呼叫一下recv如果返回錯誤就表示超時了,本socket已經無效,自己進行錯誤處理了。

還有值得注意的是伺服器也必須支援keepalive.單方面那是沒有用的。

3.具體**

本人的客戶端是linux2.4.x

keepalive選項的設定是全系統有效的,設定如下

echo 170 > /proc/sys/net/ipv4/tcp_keepalive_time

echo 2 > /proc/sys/net/ipv4/tcp_keepalive_intvl

echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes

以上增加到系統啟動指令碼/etc/init.d/****中

tcp_keepalive_time  //每次確認包傳送的間隔時間

tcp_keepalive_probes//每次確認最多重發次數

tcp_keepalive_intvl //重試間隔

單位秒//啟用socket連線的保持連線包的傳送

int ikeepalive = 1;

setsockopt(s, sol_socket, so_keepalive, (void *)&ikeepalive, sizeof(ikeepalive));

用select 語句獲取read狀態,recv返回錯誤後進行錯誤處理,具體不在詳述了

linux ubuntu debian 使用筆記

基於debian的ubuntu使用apt get 可方便地進行安裝或公升級系統,分下面幾個步驟 第一步,獲得最近的軟體包的列表 列表中包含一些包的資訊,比如這個包是否更新過。第二步,如果這個包沒有發布更新,就不管它 apt get update對應的就是第一步。apt get upgrade 與ap...

Linq Lambda GroupBy使用筆記

今天看mvc遇到了groupby的lambda表示式.有興趣詳細的看下去.得此筆記.記錄之.不羅嗦.上 得到list物件 資料來源 var groupmail xmall.plugin.edm.utility.datacache.emailgroup.cachelist 首先得到乙個資料來源物件 這...

Vim 使用筆記

set hlsearch set nohlsearch 搜尋後清除上次的加亮 nohl nohlsearch 拷貝 很有用的一句話,規定了格式選項,讓它換行不自動空格 set formatoptions tcrqn set fo r set noautoindent 再 shift insert 正...