我试图设置tcp保持活着,但这样做,我看到了错误
“无议定书”
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));我可以打开“保持活动”,设置“保持活动间隔”和“计数”,但是“保持活动”空闲--即保持活动时间--正在抛出该错误,而且我从未看到使用wireshark和过滤器tcp.analysis.keep_alive或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发布于 2014-05-15 12:14:34
在我编写的应用程序中,以下工作:
setsockopt(*sfd, SOL_SOCKET, SO_KEEPALIVE,(char *)&enable_keepalive, sizeof(enable_keepalive));
setsockopt(*sfd, IPPROTO_TCP, TCP_KEEPCNT, (char *)&num_keepalive_strobes, sizeof(num_keepalive_strobes));
setsockopt(*sfd, IPPROTO_TCP, TCP_KEEPIDLE, (char *)&keepalive_idle_time_secs, sizeof(keepalive_idle_time_secs));
setsockopt(*sfd, IPPROTO_TCP, TCP_KEEPINTVL, (char *)&keepalive_strobe_interval_secs, sizeof(keepalive_strobe_interval_secs));尝试将SOL_SOCKET更改为IPPROTO_TCP for TCPKEEPIDLE。
发布于 2014-05-15 06:23:27
有一个非常方便的库,可以帮助您,它被称为libkeepalive:http://libkeepalive.sourceforge.net/
它可以与LD_PRELOAD一起使用,以便在所有TCP套接字上启用和控制保持活动状态。您还可以使用环境变量覆盖保持活动的设置。
我试图使用它运行tcp服务器:
KEEPIDLE=5 KEEPINTVL=5 KEEPCNT=100 LD_PRELOAD=/usr/lib/libkeepalive.so nc -l -p 4242然后我连接了一个客户:
nc 127.0.0.1 4242我用Wireshark可视化了流量:保持活着的数据包完全是在5秒的不活动之后开始的(我的系统范围设置是75)。因此,这意味着可以重写系统设置。
下面是libkeepalive如何设置TCP_KEEPIDLE
if((env = getenv("KEEPIDLE")) && ((optval = atoi(env)) >= 0)) {
setsockopt(s, SOL_TCP, TCP_KEEPIDLE, &optval, sizeof(optval));
}看起来他们使用的是SOL_TCP而不是SOL_SOCKET。
https://stackoverflow.com/questions/23669005
复制相似问题