如何在MAC OS X下配置TCP_KEEPALIVE

时间:2013-04-07 07:53:05

标签: c++ c macos

目前我遇到了这个问题:如何检测不可预测的连接中断。

我利用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

任何回复都将不胜感激。

2 个答案:

答案 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_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT是特定于Linux的,你不会在OSX上找到它们等效的计数器部分。

设置SO_KEEPALIVE执行此操作

int optval = 1;
setsockopt(sock, SOL_SOCKET, &optval, sizeof(optval));

我很久以前使用的另一个技巧是尝试发送0(零)个字节数,这将检查套接字是否仍然存活。无论是作为重复的看门狗还是在尝试发送消息之前。