【发布时间】:2019-08-29 15:59:26
【问题描述】:
有没有办法在 vxworks 中为单个套接字描述符设置 keepalive?我在一些文档中读到,setsockopt 函数中的“SOL_TCP”选项会在 linux 中起到这样的作用。 VxWorks 中也有这样的功能吗?如果是这样,请提供相关的详细信息,例如我们需要包含哪些包含文件以及如何使用此类选项等。
【问题讨论】:
有没有办法在 vxworks 中为单个套接字描述符设置 keepalive?我在一些文档中读到,setsockopt 函数中的“SOL_TCP”选项会在 linux 中起到这样的作用。 VxWorks 中也有这样的功能吗?如果是这样,请提供相关的详细信息,例如我们需要包含哪些包含文件以及如何使用此类选项等。
【问题讨论】:
来自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 版本中,您可以全局更改这些值,并且创建的所有套接字都会生效。 下面的问题是如何完成的答案。
How to set TCP keep alive interval for a specific socket fd (Not system wide) in VxWorks?
【讨论】: