我在通过下面的代码写入TCP端口的C++应用程序中实现Keepalive时间。没有显示,但我确实检查了有效的退货状态,以验证设置选项是否有效。Keepalive时间 - 在C++中不能减少到一分钟以下
int option = 1;
int keepalive_intvl = 1;
int keepalive_count = 1;
int keepalive_idle = 1;
setsockopt(the_socket, SOL_SOCKET, SO_KEEPALIVE, &option, sizeof (int));
setsockopt(the_socket, SOL_TCP, TCP_KEEPINTVL, &keepalive_intvl, sizeof(int));
setsockopt(the_socket, SOL_TCP, TCP_KEEPCNT, &keepalive_count, sizeof(int));
setsockopt(the_socket, SOL_TCP, TCP_KEEPIDLE, &keepalive_idle, sizeof(int));
我的应用程序正在写入TCP端口,并尝试每秒写入数次。
// write null packet to determine if connection is still good
return (send(GetDescriptor(),(char*)NULL, 0, 0) != -1);
每当我关闭其他,输入连接,它需要一分钟,我的申请报告,连接中断,基于上面的测试。如果我有一个SIGPIPE
处理程序函数,它也需要一分钟时间才能被调用。
我看到的每个文档都表明keepalive参数是以秒为单位的,而不是分钟。但是我无法在1分钟之内检测到丢失的连接。
我也试过改变系统变量keepalive讨论在tldp.org讨论,但无济于事。
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes
此行为是否受另一个系统参数控制?与一些文档相反,Keepalive参数实际上是在几分钟内?有什么函数可以影响这个超时参数吗?
选项是一个int不INT32 – QuentinUK 2013-03-05 18:13:52
@QuentinUK,他们在我的代码相同。尽管如此,编辑清晰。 – Chance 2013-03-05 18:22:01
您是否尝试过实际检查'setsockopt()'的返回码? – 2013-03-05 18:32:26