2014-05-15 70 views
1

我正在尝试设置TCP存活,但这样做的,我看到的错误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)); 

我能够打开存活,设置存活时间间隔和次数但存活闲置是存活时间抛出的错误,我从来没有看到正在发送/接收或者使用Wireshark和过滤器的任何保留数据包tcp.analysis.keep_alive或使用tcpdump

sudo tcpdump -vv "tcp[tcpflags] == tcp-ack and less 1" 

是否有一个内核模块塔吨需要加载或什么?或者你不再能够覆盖全球KEEPIDLE时间。

通过

[email protected]:~/ 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 
+0

tcp_keepalive_time以秒为单位的时间被发送的第一个活动包之前。根据你的例子,它被设置为2小时。你真的等了那么久吗?减少它,然后再试一次。 – KBart

+0

@KBart - 确切地说。这是默认设置。我想从默认值改变它,但它给了我“协议不可用”。 – Matt

回答

2

在一个应用程序,我的代码,以下工作:

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_SOCKETIPPROTO_TCPTCPKEEPIDLE

+0

Doh!感谢Prabhu。我将SOL_SOCKET作为所有选项的第二个参数。它正在工作! – Matt

0

有一个非常方便的LIB的输出,可以帮助你,这就是所谓的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)。因此这意味着可以覆盖系统设置。

这里是如何libkeepaliveTCP_KEEPIDLE

if((env = getenv("KEEPIDLE")) && ((optval = atoi(env)) >= 0)) { 
    setsockopt(s, SOL_TCP, TCP_KEEPIDLE, &optval, sizeof(optval)); 
    } 

看起来他们使用SOL_TCP代替SOL_SOCKET

+0

无法使用它。我不写GPL代码,所以也不能链接到它。我只想有什么应该工作,工作。 – Matt

+0

好吧,但我告诉过你,你的代码可能不起作用,因为你使用SOL_SOCKET,libkeepalive使用SOL_TCP。 – Grapsus

+0

欣赏,但它只需要将SOL_SOCKET更改为IPPROTO_TCP。固定。 – Matt