Linux系統下TCP keepalive屬性檢視

2021-05-22 21:26:15 字數 1195 閱讀 7862

會員收藏

遊客收藏  【

大中小】  

tcp是面向連線的,在實際應用中通常都需要檢測連線是否還可用.如果不可用,可分為:

a. 連線的對端正常關閉.

b. 連線的對端非正常關閉,這包括對端裝置掉電,程式崩潰,網路被中斷等.這種情況是不能也無法通知對端的,所以連線會一直存在,浪費國家的資源.

tcp協議棧有個keepalive的屬性,可以主動探測socket是否可用,不過這個屬性的預設值很大.

全域性設定可更改/etc/sysctl.conf,加上:

net.ipv4.tcp_keepalive_intvl = 20

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_time = 60

在程式中設定如下:

#include 

#include

#include

#include

#include

int keepalive = 1; // 開啟keepalive屬性

int keepidle = 60; // 如該連線在60秒內沒有任何資料往來,則進行探測

int keepinterval = 5; // 探測時發包的時間間隔為5 秒

int keepcount = 3; // 探測嘗試的次數.如果第1次探測包就收到響應了,則後2次的不再發.

setsockopt(rs, sol_socket, so_keepalive, (void *)&keepalive, sizeof(keepalive));

setsockopt(rs, sol_tcp, tcp_keepidle, (void*)&keepidle, sizeof(keepidle));

setsockopt(rs, sol_tcp, tcp_keepintvl, (void *)&keepinterval, sizeof(keepinterval));

setsockopt(rs, sol_tcp, tcp_keepcnt, (void *)&keepcount, sizeof(keepcount));

在程式中表現為,當tcp檢測到對端socket不再可用時(不能發出探測包,或探測包沒有收到ack的響應包),select會返回socket可讀,並且在recv時返回-1,同時置上errno為etimedout。

雙系統下解除安裝linux系統

雙系統 win10 centos6.8 目的 電腦加裝硬碟後,想把centos安裝到新的磁碟上,第一步,先解除安裝原有centos。注意 雙系統都知道,先按windows,再安裝linux,windows是通過linux系統下的啟動引導檔案引導的,若解除安裝linux,windows自然無法啟動,這...

Linux下獲取系統資訊

相關函式 include int gethostname char name,size t name include int uname struct utsname name 相關結構 struct utsname 例子int main void printf host name s n comp...

雙系統下刪除Linux

我的電腦安裝了雙系統,windows和linux,不過由於linux在最近一段時間內不會使用,所以我打算刪除linux。刪除linux最需要注意的地方,就是mbr master boot record 在刪除linux分割槽前,我們需要將啟動windows的引導資訊寫入mbr,否則,mbr中的lin...