我在通过下面的代码写入 TCP 端口的 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 参数以秒为单位,而不是分钟。但是我无法在一分钟以下检测到断开的连接。
我还尝试更改tldp.org上讨论的与 keepalive 相关的系统变量,但无济于事。
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 参数实际上是在几分钟内吗?我应该在代码中寻找可能影响此超时参数的某个函数吗?