【发布时间】:2018-11-22 20:50:39
【问题描述】:
我正在尝试设置 tcp keepalive,但这样做我看到了错误
“协议不可用”
int rc = setsockopt(s, SOL_SOCKET, TCP_KEEPIDLE, &keepalive_idle, sizeof(keepalive_idle));
if (rc < 0)
printf("error setting keepalive_idle: %s\n", strerror(errno));
我可以打开keepalive,设置keepalive间隔和计数,但是keepalive idle(keepalive时间)会抛出该错误,我从来没有看到使用wireshark和过滤器tcp.analysis.keep_alive或使用任何keepalive数据包传输/接收tcpdump
sudo tcpdump -vv "tcp[tcpflags] == tcp-ack and less 1"
是否有需要加载的内核模块之类的?还是您不再能够覆盖全局 KEEPIDLE 时间。
顺便输出一下
matt@devpc:~/ sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
【问题讨论】:
-
tcp_keepalive_time 是发送第一个保活数据包之前的时间(以秒为单位)。根据您的示例,它设置为 2 小时。你真的等了那么久吗?减少并重试。
-
@KBart - 完全正确。这是默认设置。我想将其从默认值更改,但它给了我“协议不可用”。