2015-09-10 7 views
2

Я пытаюсь выяснить, как чистый класс Node.js работает с таймаутами и keepalives. Я устанавливаю их на стороне сервера и смотрю, чтобы увидеть, в чем разница, устанавливая эти переменные. Я заметил, что если я установить KeepAlive на следующее:Node.js set setKeepAlive не останавливает таймаут с помощью setTimeout

// Set keepalive 
socket.setKeepAlive(true, 30000); 

Это будет абсолютно на самом деле отправлять пакеты проверки, которые я наблюдаю с Wireshark.

Keep alive with Wireshark

Однако, даже если я подписаться на события тайм-аута сокета, сокет не будет разрываться. Поэтому я пытаюсь установить параметр таймаута сокета.

// Set timeout variables 
socket.setTimeout(60000); 

Даже в сочетании с опцией keepAlive гнездо все еще разгоняется через 60 секунд после последнего реального переданного пакета.

Connection timeout

Так что мой вопрос, что точка Keepalive, если он не делает ничего, чтобы предотвратить сокетов время ожидания?

ответ

1

socket.setTimeout() просто излучает timeout событие, когда не было ни одного данные полученные после любой продолжительности вы указываете. socket.setKeepAlive() предназначен для отправки зондов keepalive в качестве средства для обнаружения мертвых гнезд.

Эти две функции работают на двух разных уровнях/уровнях. Keepalive зонды не считаются «данными», поэтому вы видите событие timeout.

+0

Что такое «мертвый» разъем? Если я вытащил провод Ethernet, гнездо все еще остается в живых и не излучает никаких сигналов конца/ошибки. Это даже позволит мне по-прежнему пытаться отправлять данные на него. Он отправляет только один живой сигнал, а затем ничего не испускает. Розетка должна действительно погибнуть. –

+0

Мертвые сокеты - это гнезда, которые не ответили на отправленные датчики keepalive в течение x времени (количество зондов keepalive, количество времени и другие параметры являются настройками уровня ОС и настраиваются (по крайней мере, на * nix)). Часто значения по умолчанию для этих средних мертвых сокетов не обнаруживаются до нескольких часов позже. Вот почему всегда лучше использовать сообщения keepalive на уровне приложения для определения мертвых соединений. – mscdex

 Смежные вопросы

  • Нет связанных вопросов^_^