有没有办法在 vxworks 中为单个套接字描述符设置 keepalive?我在一些文档中读到,setsockopt 函数中的“SOL_TCP”选项会在 linux 中起到这样的作用。VxWorks 中是否也提供此类功能?如果是这样,请提供相同的相关详细信息,例如我们需要包含哪些包含文件以及如何使用此类选项等。
2 回答
从 VxWorks“库参考”手册(可以下载):
流式套接字选项
以下部分讨论可用于流 (TCP) 套接字的套接字选项。
SO_KEEPALIVE -- 检测死连接
指定 SO_KEEPALIVE 选项以使传输协议 (TCP) 启动计时器以检测死连接:
setsockopt (sock, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof (optval));
这可以防止应用程序挂在无效连接上。此选项的 optval 值是整数(类型 int),1(打开)或 0(关闭)。通过传输由计时器触发的零长度 TCP 段来验证连接的完整性,以强制对等节点做出响应。如果对等点在重复传输KEEPALIVE段后没有响应,则断开连接,回收所有协议数据结构,并且在连接上休眠的进程被唤醒并出现ETIMEDOUT错误。
ETIMEDOUT超时可以通过两种方式发生。如果连接尚未建立,则KEEPALIVE计时器在TCPTV_KEEP_INIT空闲后到期。如果建立了连接,当TCPTV_KEEP_IDLE没有流量时,KEEPALIVE 计时器就会启动。如果在间隔TCPTV_KEEPINTVL发送KEEPALIVE段TCPTV_KEEPCNT次后没有收到来自对等方的响应,则 TCP 假定连接无效。参数TCPTV_KEEP_INIT、TCPTV_KEEP_IDLE、TCPTV_KEEPCNT和TCPTV_KEEPINTVL在文件 target/h/net/tcp_timer.h 中定义。
在 vxworks 6.8 版本之后,setsockopt 支持的 IP_TCP_KEEPINTVL 以及 TCP_KEEPIDLE、TCP_KEEPCNT 选项。在以前的 vxworks 版本中,您可以全局更改这些值,并且创建的所有套接字都会生效。下面的问题是如何完成的答案。