Linux下TCP keepalive屬性的表現

2021-06-13 06:46:34 字數 1356 閱讀 1035

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

socket

.h>

#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下Redis下安裝

redis安裝 檢查是否安裝redis ps ef grep redis2.檢查gcc服務是否安裝成功 rpm qa grep gcc注 安裝成功則顯示 mkdir redis5.解壓redis安裝包 tar zxvf redis 2.8.17 tar.gz c usr local redis 解壓...

Linux下程式設計

windows下我的環境為 windows10 vs2015 opencv3.4.0 opencv3.4.0 contrib python linux下我的環境為 ubuntu16004 也有ubuntu1804 opencv3.4.0 opencv3.4.0 contrib python gnu ...

linux下萬用字元

萬用字元是一類鍵盤字元,有星號 和問號 當查詢檔案呀資料夾時,可以使用它來代替乙個或多個真正字元 當不知道真正字元或者不想建入完整名字時,常常使用萬用字元代替乙個或多個真正字元。星號 可以使用星號代替0個或多個字元。如果正在查詢以aew開頭的乙個檔案,但不記得檔名其餘部分,可以輸入aew,查詢以ae...