Как установить интервал поддержания активности TCP для определенного сокета fd (не для всей системы) в VxWorks?

Я создал сокет 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 На этот вопрос нет моего ответа. Пожалуйста, проверьте. Первый ответ - это тот же вопрос, который я задал здесь, а во втором ответе эта ссылка не работает.


person Webster    schedule 02.08.2019    source источник
comment
Возможный дубликат Как установить параметр поддержки активности для отдельного сокета в VxWorks   -  person Some programmer dude    schedule 02.08.2019
comment
И помните, что вы должны передавать указатель на переменную, значение которой является значением, которое вы хотите установить, а не передавать фактическое значение, приведенное в качестве указателя.   -  person Some programmer dude    schedule 02.08.2019
comment
Срок действия равен timeout=infinity сек. Когда он существует 5 секунд, он равен timeout=5 секундам.   -  person nick_n_a    schedule 02.08.2019
comment
Я не нашел свой ответ из дублирующего вопроса. Я уже проверил это. Спасибо, что указали на это, мой плохой. Но здесь я хотел знать, могу ли я установить интервал поддержания активности конкретно для этого сокета, используя setsockopt.   -  person Webster    schedule 02.08.2019
comment
Если операция не поддерживается, вы не сможете ее выполнить. Это кажется довольно очевидным,   -  person user207421    schedule 29.08.2019


Ответы (1)


Я предполагаю, что ваша версия vxworks меньше, чем 6.8. потому что эта опция (IP_TCP_KEEPINTVL, а также TCP_KEEPIDLE, TCP_KEEPCNT) не поддерживается setsockopt для предыдущих выпусков vxworks. Насколько я знаю, нет возможности установить эту опцию отдельно для конкретного сокета fd для предыдущих выпусков.

person Tturk    schedule 29.08.2019