我在应用程序中创建了一个TCP套接字,并为此套接字启用了keepAlive。我可以看到,在IPTCP的系统变量中,即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 %dn",
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 %dn",
sockFD, SOL_SOCKET, SO_KEEPALIVE,
(char*) &optVal, sizeof(optVal), errnum );
}
上面的两个setSockopt都返回了不支持操作的相同错误状态。(45,ip_errno_eopnotsupp(
在这里,我想将TCP保持活跃的间隔为5秒。
我希望将特定套接字FD的TCP保持活跃间隔。
编辑:这个问题不是如何在VXWORKS中设置Induvidual插座的keepalive选项的重复这个问题没有我的答案。请检查。第一个答案是我在这里问的相同的问题,在第二个答案中,链接不起作用。
我想您的VXWorks版本小于6.8。因为此选项(IP_TCP_KEEPINTVL以及TCP_KEECIDLE,TCP_KEEPCNT(不受SetSockopt的vxWorks版本的支持。据我所知,没有办法为以前发行版的特定套接字FD单独设置此选项。
我认为问题是将参数输入到socketopt
。而不是使用(char*)5
,您需要写出以下内容:
int nOpt=5;
(char*)&nOpt