MAC OS X下如何配置TCP_KEEPALIVE
How to configure TCP_KEEPALIVE under MAC OS X
目前我遇到了这个问题:如何检测不可预测的连接断开。
我在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_KEEPINTVL
和TCP_KEEPCNT
是Linux特定的,你不会在OSX上找到它们的对应部分。
设置SO_KEEPALIVE
int optval = 1;
setsockopt(sock, SOL_SOCKET, &optval, sizeof(optval));
很久以前我使用的另一个技巧是尝试发送0(零)字节数,这将检查套接字是否仍然存活。要么作为重复的看门狗,要么只是在试图发送消息之前。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 无法找到/读取配置文件.conf-FileIOException
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 一种在C++中读取TXT配置文件的简单方法
- 生成MRPT库时cmake配置失败
- FFMPEG配置文件级别id大小无效
- 如何通过Conan和CMake找到用于pkg配置的.pc文件
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 配置文件解析器仅返回以前的值
- 提升 Asio TCP 服务器 处理多个客户端
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 是否可以配置提升日志刷新?
- 通过TCP的PvP通信问题
- 如何配置Visual Studio Code以使用cygwin,cmake和gcc进行调试
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- C/C++:打印(配置)头文件的内容