MAC OS X下如何配置TCP_KEEPALIVE

How to configure TCP_KEEPALIVE under MAC OS X

本文关键字:配置 TCP KEEPALIVE OS 何配置 MAC      更新时间:2023-10-16

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

我在linux下使用了SO_KEEPALIVE,TCP_KEEPIDLE,TCP_KEEPINTVL和TCP_KEEPCNT来解决它,现在看起来运行良好。

然而,我确实花了很长时间才找到如何在MAC OS x下工作。有人建议我转向netinet/tcp_var.h,但仍然没有找到上述宏。

我的问题是,

如何在MAC OS X下实现TCP KEEPALIVE ?

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

如有任何回复将不胜感激。

实际上,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 msecs(2小时)。HTH .

我认为你应该使用setsockopt(),看看它的手册页

看起来TCP_KEEPIDLE, TCP_KEEPINTVLTCP_KEEPCNT是Linux特定的,你不会在OSX上找到它们的对应部分。

设置SO_KEEPALIVE

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

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