Я создал сокет 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
Как упоминалось выше, в соответствии с системными переменными он работает нормально. Я получаю пакеты поддержки с интервалом 30 секунд после потери 3 последовательных пакетов, мое соединение закрывается. Все работает нормально как системные переменные. Но эта конфигурация системной переменной 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 секунд.
Я ожидаю установить интервал поддержания активности tcp для определенного сокета fd.
Отредактировано: этот вопрос не является дубликатом Как установить опция keepalive для отдельного сокета в VxWorks На этот вопрос нет моего ответа. Пожалуйста, проверьте. Первый ответ - это тот же вопрос, который я задал здесь, а во втором ответе эта ссылка не работает.