【发布时间】:2019-12-11 02:41:27
【问题描述】:
我在应用程序中创建了一个 TCP 套接字,并为此套接字启用了 KEEPALIVE。我可以看到keepalive数据包以我已经在iptcp的系统变量中设置的keepalive间隔的频率出现,即30秒。
套接字创建:
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的重复问题 这个问题没有我的答案。请检查。第一个答案与我在这里提出的问题相同,而在第二个答案中链接不起作用。
【问题讨论】:
-
请记住,您应该将一个指针传递给一个变量,该变量的值是您要设置的值,而不是传递转换为指针的实际值。
-
保持活动等于 timeout=infinity 秒。当它存在 5 秒时,它等于 timeout=5 秒。
-
我没有从重复的问题中找到答案。我已经检查过了。感谢您指出这一点,我的错。但是在这里我想知道是否使用setsockopt,我是否可以专门为这个socket设置keepalive间隔。
-
如果不支持该操作,则无法执行。这似乎很明显,
标签: c tcp vxworks setsockopt tcp-keepalive