首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tcp保持活着-协议不可用?

tcp保持活着-协议不可用?
EN

Stack Overflow用户
提问于 2014-05-15 03:57:08
回答 2查看 3.4K关注 0票数 1

我试图设置tcp保持活着,但这样做,我看到了错误

“无议定书”

代码语言:javascript
复制
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发送/接收任何保持活着的数据包。

代码语言:javascript
复制
sudo tcpdump -vv "tcp[tcpflags] == tcp-ack and less 1"

是否有需要加载的内核模块?或者您不再能够覆盖全局KEEPIDLE时间。

顺便说一下……的输出

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-15 12:14:34

在我编写的应用程序中,以下工作:

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2014-05-15 06:23:27

有一个非常方便的库,可以帮助您,它被称为libkeepalivehttp://libkeepalive.sourceforge.net/

它可以与LD_PRELOAD一起使用,以便在所有TCP套接字上启用和控制保持活动状态。您还可以使用环境变量覆盖保持活动的设置。

我试图使用它运行tcp服务器:

代码语言:javascript
复制
KEEPIDLE=5 KEEPINTVL=5 KEEPCNT=100 LD_PRELOAD=/usr/lib/libkeepalive.so nc -l -p 4242

然后我连接了一个客户:

代码语言:javascript
复制
nc 127.0.0.1 4242

我用Wireshark可视化了流量:保持活着的数据包完全是在5秒的不活动之后开始的(我的系统范围设置是75)。因此,这意味着可以重写系统设置。

下面是libkeepalive如何设置TCP_KEEPIDLE

代码语言:javascript
复制
  if((env = getenv("KEEPIDLE")) && ((optval = atoi(env)) >= 0)) {
    setsockopt(s, SOL_TCP, TCP_KEEPIDLE, &optval, sizeof(optval));
  }

看起来他们使用的是SOL_TCP而不是SOL_SOCKET

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23669005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档