目前我遇到了这个问题:如何检测不可预测的连接中断。
我利用SO_KEEPALIVE,TCP_KEEPIDLE,TCP_KEEPINTVL和TCP_KEEPCNT在linux下解决它,现在看起来工作正常。
然而,我花了很长时间才找到如何在MAC OS X下解决这个问题。有人建议我转向netinet / tcp_var.h,但仍未找到上述MACRO。
所以,我的问题是,
如何在MAC OS X下实现TCP KEEPALIVE?
P.S。:我的MAC OS X版本是10.8.3,而我的gcc / g ++版本是4.2.1
任何回复都将不胜感激。
答案 0 :(得分:7)
实际上,Darwin(BSD)比Linux简单。设置TCP_KEEPALIVE(secs)选项,以及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。
答案 1 :(得分:0)
我认为你应该使用setsockopt()
,看看它的手册页
看起来TCP_KEEPIDLE
,TCP_KEEPINTVL
和TCP_KEEPCNT
是特定于Linux的,你不会在OSX上找到它们等效的计数器部分。
设置SO_KEEPALIVE
执行此操作
int optval = 1;
setsockopt(sock, SOL_SOCKET, &optval, sizeof(optval));
我很久以前使用的另一个技巧是尝试发送0(零)个字节数,这将检查套接字是否仍然存活。无论是作为重复的看门狗还是在尝试发送消息之前。