在服务器挂掉后,TCP keepalive(具有较小的超时)是否会阻止客户端挂在接收上?
场景:
服务器和客户端运行在不同的机器上:
- 客户端通过带有 KEEPALIVE 选项的 TCP 连接到服务器
- 客户端发送“Hello server”并等待响应
- 服务器收到“Hello server”并响应“Hello client”
- 客户端收到响应,休眠 10 秒并重复步骤 2-4(现在跳过步骤 1 - 保留连接)
在客户端睡眠期间,服务器已关闭,现在:
- 客户醒来
- 发送“Hello server”并等待响应
-
20 分钟后,recv 放弃 - 我期望 KEEPALIVE 会在45秒:
设置 KEEPALIVE 选项:
void TCPclient::setkeepalive()
{
int optval;
socklen_t optlen = sizeof(optval);
/* Check the status for the keepalive option */
if(getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) {
throw std::string("getsockopt");
}
optval = 1;
optlen = sizeof(optval);
if(setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
close(s);
exit(EXIT_FAILURE);
}
optval = 2;
if (setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &optval, optlen) < 0) {
throw std::string("setsockopt");
}
optval = 15;
if (setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &optval, optlen) < 0) {
throw std::string("setsockopt");
}
optval = 15;
if (setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &optval, optlen) < 0) {
throw std::string("setsockopt");
}
}
Linux 3.2.0-84-通用