当前,我遇到了这个问题:如何检测无法预测的连接断开。
我在Linux下利用SO_KEEPALIVE,TCP_KEEPIDLE,TCP_KEEPINTVL和TCP_KEEPCNT来解决它,现在看来工作正常。
但是,确实花了我很长时间才能找到如何在MAC OS X下工作的方法。有人建议我转向netinet/tcp_var.h,但仍然找不到上述MACRO。
所以,我的问题是
如何在MAC OS X下实现TCP KEEPALIVE?
附言:我的MAC OS X版本是10.8.3,我的gcc/g++版本是4.2.1
任何答复将不胜感激。
最佳答案
实际上,达尔文(BSD)比Linux更简单。设置TCP_KEEPALIVE(秒)选项以及SO_KEEPALIVE( bool )选项:
int on = 1, secs = 10;
setsockopt(skt, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof on);
setsockopt(skt, IPPROTO_TCP, TCP_KEEPALIVE, &secs, sizeof secs);
要查看默认间隔是多少(如果您刚刚进行过SO_KEEPALIVE),请使用:
sysctl -A | grep net.inet.tcp.*keep
您可能会看到:
net.inet.tcp.keepidle: 7200000
net.inet.tcp.keepintvl: 75000
net.inet.tcp.keepinit: 75000
net.inet.tcp.always_keepalive: 0
即keepalive仅在设置了SO_KEEPALIVE的套接字上打开,并且空闲超时为72000.000毫秒(2小时)。 HTH。
关于c++ - 如何在MAC OS X下配置TCP_KEEPALIVE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15860127/