我有一个客户端connect()连接到服务器,闲置时它会在几个小时后超时。 我加了 setsockopt(socket,SOL_SOCKET,SO_KEEPALIVE ...)1秒 但它没有什么区别。 为什么Keepalive不会工作的任何线索? 如果我使用SOL_TCP而不是SOL_SOCKET,它会有所作为吗? 这是在Linux上。套接字Keepalive无法正常工作
回答
int val = 1;
setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof val)
只是启用keepalives。你会得到默认的定时器的存活探测,您可以用命令查看:
sysctl net.ipv4.tcp_keepalive_time
通常默认值是几个小时。
如果要更改默认的定时器,你可以这样做:
struct KeepConfig cfg = { 60, 5, 5};
set_tcp_keepalive_cfg(fd, &cfg);
随着辅助功能在这里:
struct KeepConfig {
/** The time (in seconds) the connection needs to remain
* idle before TCP starts sending keepalive probes (TCP_KEEPIDLE socket option)
*/
int keepidle;
/** The maximum number of keepalive probes TCP should
* send before dropping the connection. (TCP_KEEPCNT socket option)
*/
int keepcnt;
/** The time (in seconds) between individual keepalive probes.
* (TCP_KEEPINTVL socket option)
*/
int keepintvl;
};
/**
* enable TCP keepalive on the socket
* @param fd file descriptor
* @return 0 on success -1 on failure
*/
int set_tcp_keepalive(int sockfd)
{
int optval = 1;
return setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
}
/** Set the keepalive options on the socket
* This also enables TCP keepalive on the socket
*
* @param fd file descriptor
* @param fd file descriptor
* @return 0 on success -1 on failure
*/
int set_tcp_keepalive_cfg(int sockfd, const struct KeepConfig *cfg)
{
int rc;
//first turn on keepalive
rc = set_tcp_keepalive(sockfd);
if (rc != 0) {
return rc;
}
//set the keepalive options
rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &cfg->keepcnt, sizeof cfg->keepcnt);
if (rc != 0) {
return rc;
}
rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &cfg->keepidle, sizeof cfg->keepidle);
if (rc != 0) {
return rc;
}
rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &cfg->keepintvl, sizeof cfg->keepintvl);
if (rc != 0) {
return rc;
}
return 0;
}
尽管它的名字,保活是不是保持连接活着,它是关于定期交换数据包以确保对等体之间存在网络路径。它会导致在闲置时延长网络中断的连接。
由于这种行为,除非有充分的理由,如telnet或SSH连接,当客户端失去联系时可以合理地终止会话,否则不应使用保持活动状态。
由于某些连接处理策略,很可能是服务器在n小时后关闭连接,无论存活使用情况如何。
编号服务器没有关闭它。当它闲置时连接才会超时。 keepalive的目的是为了让它看起来“非空闲” - 这就是没有工作 – excalibur
也许某些中间路由器/防火墙/ NAT建立了连接超时。在Linux中,常见的NAT超时是1小时(3600秒)。 – epx
当像防火墙/ NAT这样的网络中介决定终止一个空闲连接时,它会(在绝大多数情况下)简单地消除它,而不通知连接对等方连接已经消失(例如没有FIN数据包)。因此,从同行的角度来看,连接是活跃的,他们可以发现套接字已经消失的唯一方法是使用读取超时。通过keepalive机制,TCP/IP协议栈会检测到断开连接,因此应用程序会在很早之前收到断开连接的通知(如果适当降低空闲时间设置)。 –
- 1. richfaces keepAlive无法正常工作
- 2. NodeJS套接字连接无法正常工作
- 3. Android套接字无法创建,Telnet连接正常工作
- 4. 套接字写入无法正常工作c#
- 5. 无法使Flash套接字策略文件正常工作
- 6. C++套接字不能正常工作
- 7. 嵌套循环无法正常工作
- 8. 套接字KeepAlive单元
- 9. 深层链接无法正常工作
- 10. 链接无法正常工作
- 11. 分页链接无法正常工作
- 12. JSF - 链接无法正常工作
- 13. Cordova - openDatabase连接无法正常工作
- 14. PHP链接无法正常工作
- 15. bootstrap超链接无法正常工作
- 16. 链接控件无法正常工作
- 17. MySQL左连接无法正常工作
- 18. CSS链接无法正常工作
- 19. 删除链接无法正常工作?
- 20. 链接列表无法正常工作
- 21. 链接无法正常工作
- 22. 分页链接无法正常工作?
- 23. 链接无法正常工作
- 24. 取消链接无法正常工作
- 25. html链接无法正常工作
- 26. PHP链接无法正常工作
- 27. mySQL连接无法正常工作
- 28. PHP连接无法正常工作
- 29. react-router链接无法正常工作
- 30. Phonegap链接无法正常工作
定义'几个小时后超时'。那确切的症状是什么? – EJP
errno 110 - 连接超时。我做了一个tcpdump,并没有看到keepalive消息 – excalibur