0

我在一个应用程序中创建了一个 TCP 套接字,并为此套接字启用了 KEEPALIVE。我可以看到keepalive数据包以我已经在iptcp的系统变量中设置的keepalive间隔的频率出现,即30secs。

套接字创建:

  if( ( sockFD = socket( AF_INET, SOCK_STREAM, 0 ) ) == ERROR )
  {
    DS_SWX_ERROR( "socket(%d,%d,%d) failed.", AF_INET, SOCK_STREAM, 0 );
    return;
  }

VxWorks TCP 系统变量:

[vxWorks *]# sysvar list iptcp
System variables:
   iptcp.KeepCnt=3
   iptcp.KeepIdle=60
   iptcp.KeepIntvl=30

如上所述,根据系统变量,它工作正常。在连续 3 个数据包丢失后,我的连接关闭后,我会以 30 秒的间隔收到保持活动的数据包。一切都作为系统变量工作正常。但是这个 TCP 系统变量配置对于所有启用了保持活动的套接字都是相同的。

我只想为我创建的套接字设置此保持活动间隔,而不是为整个系统设置。

我已经尝试使用 setsockopt 设置保持活动间隔。

 if( (setsockopt( sockFD, SOL_SOCKET, IP_TCP_KEEPINTVL,
      (char *)5, sizeof(int) )) == ERROR )
  {
    DS_SWX_ERROR( "setsockopt(%d,%d,%d,0x%x,%d) failed, Error is %d\n",
                  sockFD, SOL_SOCKET, SO_KEEPALIVE,
                  (char*) &optVal, sizeof(optVal), errnum );
  }

 if( (setsockopt( sockFD, IP_IPPROTO_IP, IP_TCP_KEEPINTVL,
      (char *)5, sizeof(int) )) == ERROR )
  {
    DS_SWX_ERROR( "setsockopt(%d,%d,%d,0x%x,%d) failed, Error is %d\n",
                  sockFD, SOL_SOCKET, SO_KEEPALIVE,
                  (char*) &optVal, sizeof(optVal), errnum );
  }

上述 setsockopt 都返回相同的错误状态,即不支持操作。(45,IP_ERRNO_EOPNOTSUPP)

在这里,我想将 TCP KEEP ALIVE INTERVAL 设置为 5 秒。

我希望为特定的套接字 fd 设置 tcp 保持活动间隔。

编辑:这个问题不是How to set keepalive option for induvidual socket in VxWorks的副本 那个问题没有我的答案。请检查。第一个答案是我在这里问的同一个问题,在第二个答案中链接不起作用。

4

1 回答 1

1

我想你的 vxworks 版本低于 6.8。因为该选项(IP_TCP_KEEPINTVL 以及 TCP_KEEPIDLE、TCP_KEEPCNT)在 vxworks 的早期版本中不受 setsockopt 支持。据我所知,没有办法为以前版本的特定套接字 fd 单独设置此选项。

于 2019-08-29T07:37:19.563 回答