Официальный форум СВД Встраиваемые Системы
17 Октября, 2017, 10:33:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: KEEPALIVE в QNX4.25  (Прочитано 371 раз)
BrutNemo
Интересующийся

Сообщений: 1


« : 14 Января, 2017, 13:02:25 »

Доброго времени суток!

Для обнаружения физического разрыва соединения предполагается использовать опцию SO_KEEPALIVE.

Подскажите, есть ли возможность изменить количество пакетов (по умолчанию  8 ) и таймаут между ними (по умолчанию 75 сек)?

Используемая ОС - QNX4.25
Версия стека протоколов TCPIP - 4.25.
Записан
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 88



WWW
« Ответ #1 : 19 Января, 2017, 15:15:46 »

Количество пакетов изменить нельзя.
Таймаут между пакетами можно изменить с помощью внутреннего механизма  сетевого стека.

Ответил подробнее вам на почту.
Записан

Сотрудник СВД Встраиваемые Системы
Zhavnis
Интересующийся

Сообщений: 4


« Ответ #2 : 14 Февраля, 2017, 11:13:22 »

Андрей, а к чему такая секретность? Вопрос то интересный.
Таймаут, а вернее период отправки keepalive, меняется с помощью того же setsockopt только для TCP:
Код:
    int on = 1;
    setsockopt( sockfd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
    // keep alive каждые 10 сек.
    int TCP_RECON_TIME = 10;
    setsockopt( sockfd, IPPROTO_TCP, TCP_KEEPALIVE, &TCP_RECON_TIME, sizeof(TCP_RECON_TIME));

А вот именно ТАЙМАУТ keepalive (время, через которое соединение не получающее ответов на "пинги" keepalive считается разорванным) в 4.25/4.25 изменить нельзя. Экспериментально у меня получилось 10 минут.
Поправьте, если не прав.
Записан
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 88



WWW
« Ответ #3 : 14 Февраля, 2017, 17:50:49 »

По-моему, TCP_KEEPALIVE это таймаут перед началом отправки 8 keepalive пакетов с периодом между ними в 75 сек:
8 пакетов х 75 секунд = 10 минут

Изначальный вопрос был об изменения количества проб и периода между ними.
« Последнее редактирование: 14 Февраля, 2017, 18:00:58 от Андрей Панченко » Записан

Сотрудник СВД Встраиваемые Системы
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 88



WWW
« Ответ #4 : 14 Февраля, 2017, 18:38:21 »

Нашёл следующие описание.

Для настройки механизма keepalive необходимо выполнить следующее:

Для подключённого сокета установить флаги
SO_KEEPALIVE в значение 1
    int    on = 1;
    if(setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&on, sizeof(on)) < 0) {
        return -1;
    }
TCP_KEEPALIVE в значение количества секунд задержки перед отправкой сообщения keepalive
    int sec = 1;
    if(setsockopt(sock,IPPROTO_TCP,TCP_KEEPALIVE,(void *)&sec,sizeof(sec)) < 0) {
        return -1;
    }
При отсутствии ответа на сообщение keepalive начинается отправка 8 сообщений keepalive с интервалом, по умолчанию равным 75 секундам. Если после отправки 8-го сообщения ответ не пришёл, соединение разрывается. Указанный таймаут можно задать через опцию '-d tcp_keepintvl' менеджера Tcpip, tcp_keepintvl задается в половинах секунды. Например для 5 секунд:
    # Tcpip -d tcp_keepintvl=10 node1

Итоговую задержку получения ошибки после потери связи можно оценить по формуле
TCP_KEEPIDLE + TCP_KEEPINTVL * 9,
где TCP_KEEPIDLE - время в секундах заданное через опцию TCP_KEEPALIVE,
TCP_KEEPINTVL - время в секудах заданное через опцию  '-d tcp_keepintvl' менеджера Tcpip
Записан

Сотрудник СВД Встраиваемые Системы
deadarcher
Пользователь

Сообщений: 71


« Ответ #5 : 15 Февраля, 2017, 10:26:21 »

Андрей, здравствуйте.

Поясните за флаг '-d' : его можно несколько раз писать ?
Например:
Tcpip -d forward -d tcp_keepintvl=10 -d udp_sendspace=40960 node1 &
Записан
Андрей Панченко
Сотрудник СВД ВС
Пользователь

Сообщений: 88



WWW
« Ответ #6 : 15 Февраля, 2017, 10:56:47 »

Должно быть можно.
Записан

Сотрудник СВД Встраиваемые Системы
Zhavnis
Интересующийся

Сообщений: 4


« Ответ #7 : 17 Февраля, 2017, 14:55:01 »

По-моему, TCP_KEEPALIVE это таймаут перед началом отправки 8 keepalive пакетов с периодом между ними в 75 сек:
8 пакетов х 75 секунд = 10 минут.
Да, всё так. Но в документации о константах 8 и 75 ни слова

TCP_KEEPALIVE
This integer option specifies the idle time in seconds for the connection before TCP starts sending keepalive probes. The default value is 2 hours. This option is effective only when the SO_KEEPALIVE socket option is enabled.
и всё...

Проверил, -d tcp_keepintvl работает и со стареньким стеком 4.25K:
Socklet -d tcp_keepintvl=10 node1 &
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2017 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 08 Сентября, 2017, 16:20:44