6

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

我使用 SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL 和 TCP_KEEPCNT 在 linux 下解决它,现在看起来工作正常。

但是,我确实花了很长时间才弄清楚如何在 MAC OS X 下解决它。有人建议我转向 netinet/tcp_var.h,但仍然没有找到上述 MACRO。

所以,我的问题是,

MAC OS X下如何实现TCP KEEPALIVE?

PS:我的 MAC OS X 版本是 10.8.3,我的 gcc/g++ 版本是 4.2.1

任何答复将不胜感激。

4

2 回答 2

14

实际上,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。

于 2014-05-27T22:33:26.617 回答
0

我认为您应该使用setsockopt(),请参阅它的手册页

它看起来像TCP_KEEPIDLE,TCP_KEEPINTVL并且TCP_KEEPCNT是特定于 Linux 的,你不会在 OSX 上找到它们的对应部分。

要设置SO_KEEPALIVE这样做

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

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

于 2013-04-07T08:19:06.953 回答