forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Flash (http://forum.boolean.name/forumdisplay.php?f=137)
-   -   Node.js тайм-аут соединения (http://forum.boolean.name/showthread.php?t=19555)

KingMaks 03.12.2014 21:38

Node.js тайм-аут соединения
 
Дело вот в чем: есть серверная сторона node.js и клиентская action scrip 3. Все хорошо работает, подключаюсь клиентом, создаю комнату, вхожу вторым клиентом в эту комнату - играем. Когда кто-то из клиентов выходит по каким-то причинам(по собственному желанию или интернет оборвало) срабатывает слушатель на серверной части
Код:

socket.on('close', function() {"какие-то действия"})
и дальше выполняются нужные действия для удаления клиента и комнаты. Но, когда подключаюсь двумя клиентами к комнате и ничего не трогаю минут 15, то соединения обрываются и слушатель
Код:

socket.on('close', function() {"какие-то действия"})
не срабатывает, следовательно не могу удалить не клиентов из списка клиентов и комната остается висеть. В чем может быть дело и как все-таки узнать, когда эти клиенты теряют связь с сервером? Спасибо, за любую информацию

moka 03.12.2014 22:31

Ответ: Node.js тайм-аут соединения
 
Имел подобную проблему когда на .Net писал сетевую часть с TCP.
Решением было переодически слать ping плиенту, если не отвечает или не удалось послать - принудиетльно отрубаем клиента. Слал каждую секунду каждому клиенту.

KingMaks 04.12.2014 01:52

Ответ: Node.js тайм-аут соединения
 
Цитата:

Сообщение от moka (Сообщение 290055)
Имел подобную проблему когда на .Net писал сетевую часть с TCP.
Решением было переодически слать ping плиенту, если не отвечает или не удалось послать - принудиетльно отрубаем клиента. Слал каждую секунду каждому клиенту.

Как-то не хотелось лишний раз сервер нагружать, и так сообщений много передается в двух направлениях, а тут еще проверка, ну пока другого выхода не вижу, спасибо, попробую.

impersonalis 04.12.2014 02:22

Ответ: Node.js тайм-аут соединения
 
Мысли
Я не скажу за ноду, но если кодить на ц\цпп с чистыми сокетами, то разные причины обрыва проверяются по-разному.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Функция recv возвращает или кол-во прочитанных байт, либо 0 если сокет корректно закрылся (судя по-всему это ты и проверяешь), но ещё функция может вернуть SOCKET_ERROR (отрицательный код), индицирующий ошибку, конкретику по которой можно узнать через WSAGetLastError. И в коде это было две ветки алгоритма обработки закрытия. Быть может, ваше программное средство, имеет аналогии в интерфейсах?
Пинг действительно кажется не очень деликатным решением: не пинг-ом единым ICMP наполнен - наверняка сетевой интерфейс получает (сам генерирует) сообщение о проблеме, просто его надо как-то проверить.

KingMaks 04.12.2014 05:06

Ответ: Node.js тайм-аут соединения
 
impersonalis, да есть еще
Код:

socket.on('error'
и
Код:

socket.on('data'
Ни один из слушателей не срабатывает. Запустил нод сервер на своем компьютере, минут 40 ждал, так соединение и не потерялось. Как только запускаю на VPS, то 15 минут примерно и все, соединение пропало, сервер ничего в лог не выводит

moka 04.12.2014 05:12

Ответ: Node.js тайм-аут соединения
 
Глянь несколько ссылок:
http://nodejs.org/api/net.html#net_s...initialdel ay
Еще `timeout` и `end` евенты.

pax 04.12.2014 07:09

Ответ: Node.js тайм-аут соединения
 
Без пинга нормально не отловить, сталкивался с этим, когда писал TCP сеть на NodeJS <=> Unity. Плюс пинг полезен, можно считать среднее время передачи пакетов и учитывать это время для интерполяции/экстраполяции. Ну и нагрузка на самом деле мизерная от него. Можно проверять время последней операции приема передачи время от времени. Если больше какого-то времени - слать пинг. Тогда будет нагрузка еще меньше.

impersonalis 04.12.2014 12:07

Ответ: Node.js тайм-аут соединения
 
Цитата:

Сообщение от pax (Сообщение 290069)
Без пинга нормально не отловить, сталкивался с этим, когда писал TCP сеть на NodeJS <=> Unity. Плюс пинг полезен, можно считать среднее время передачи пакетов и учитывать это время для интерполяции/экстраполяции. Ну и нагрузка на самом деле мизерная от него. Можно проверять время последней операции приема передачи время от времени. Если больше какого-то времени - слать пинг. Тогда будет нагрузка еще меньше.

Некоторые сетевые экраны блочат беспорядочный (частый, регулярный) пинг. К тому же есть опасение, что на уровнем ниже и так проверяется событие, т.е.: как бы не оказалось, что мы дублируем работу сетевого интерфейса. Ну а так-то - копейки, конечно.

moka 04.12.2014 14:37

Ответ: Node.js тайм-аут соединения
 
Цитата:

Сообщение от impersonalis (Сообщение 290076)
Некоторые сетевые экраны блочат беспорядочный (частый, регулярный) пинг. К тому же есть опасение, что на уровнем ниже и так проверяется событие, т.е.: как бы не оказалось, что мы дублируем работу сетевого интерфейса. Ну а так-то - копейки, конечно.

Ping'а на низком уровне TCP нету. Это уже от платформы/библиотеки зависит которая может сама реализует свой heartbeat в виде ping'а.
Но нагрузка на самом деле ничтожная, да и ping - это не отличимое сообщение от любых других, разница лишь в том что оно переодическое.
Никакой маршрутизатор или провайдер не будет блочить подобный трафик, т.к. во первых с точки зрения сети - он редкий (раз в секунду), и с точки зрения данных, он не разлечим от остального трафика, и может быть на самом деле логикой, это было бы накладно и не целесообразно фильтровать и анализировать трафик чтобы что-то там блокировать на уровне сетевой инфраструктуры.

DStalk 04.12.2014 15:24

Ответ: Node.js тайм-аут соединения
 
Это же ICMP протокол, TCP тут не при чем. Некоторые блочат ICMP-сообщения с типом 8(как раз пинг), правда нигде не видал чтобы блокировка производилась автоматически при флуде.

impersonalis 04.12.2014 15:50

Ответ: Node.js тайм-аут соединения
 
2moka: DStalk уже ответил. Про icmp как часть стека TCP/IP я писал выше.

pax 04.12.2014 16:49

Ответ: Node.js тайм-аут соединения
 
Я не про настоящий пинг. А про обычное сообщение от сервера клиенту по установленному соединению. Если не слать пакеты с сервера на Node JS, то некоторые сокеты остаются в состоянии "подключен" пока реально не смогут передать данные и не вызовут исключение. Т.е. не приходит никаких эвентов что клиент отключился давно.

moka 04.12.2014 19:37

Ответ: Node.js тайм-аут соединения
 
Аналогично, речь и не шла о использовании низкого уровня ping'а. А речь идет о отсылке нормального сообщения, которое по логике приложение имеет роль heartbeat'а или ping'а.


Часовой пояс GMT +4, время: 14:02.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot