Node.js тайм-аут соединения
Дело вот в чем: есть серверная сторона node.js и клиентская action scrip 3. Все хорошо работает, подключаюсь клиентом, создаю комнату, вхожу вторым клиентом в эту комнату - играем. Когда кто-то из клиентов выходит по каким-то причинам(по собственному желанию или интернет оборвало) срабатывает слушатель на серверной части
Код:
socket.on('close', function() {"какие-то действия"}) Код:
socket.on('close', function() {"какие-то действия"}) |
Ответ: Node.js тайм-аут соединения
Имел подобную проблему когда на .Net писал сетевую часть с TCP.
Решением было переодически слать ping плиенту, если не отвечает или не удалось послать - принудиетльно отрубаем клиента. Слал каждую секунду каждому клиенту. |
Ответ: Node.js тайм-аут соединения
Цитата:
|
Ответ: Node.js тайм-аут соединения
Мысли
Я не скажу за ноду, но если кодить на ц\цпп с чистыми сокетами, то разные причины обрыва проверяются по-разному. http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx Функция recv возвращает или кол-во прочитанных байт, либо 0 если сокет корректно закрылся (судя по-всему это ты и проверяешь), но ещё функция может вернуть SOCKET_ERROR (отрицательный код), индицирующий ошибку, конкретику по которой можно узнать через WSAGetLastError. И в коде это было две ветки алгоритма обработки закрытия. Быть может, ваше программное средство, имеет аналогии в интерфейсах? Пинг действительно кажется не очень деликатным решением: не пинг-ом единым ICMP наполнен - наверняка сетевой интерфейс получает (сам генерирует) сообщение о проблеме, просто его надо как-то проверить. |
Ответ: Node.js тайм-аут соединения
impersonalis, да есть еще
Код:
socket.on('error' Код:
socket.on('data' |
Ответ: Node.js тайм-аут соединения
Глянь несколько ссылок:
http://nodejs.org/api/net.html#net_s...initialdel ay Еще `timeout` и `end` евенты. |
Ответ: Node.js тайм-аут соединения
Без пинга нормально не отловить, сталкивался с этим, когда писал TCP сеть на NodeJS <=> Unity. Плюс пинг полезен, можно считать среднее время передачи пакетов и учитывать это время для интерполяции/экстраполяции. Ну и нагрузка на самом деле мизерная от него. Можно проверять время последней операции приема передачи время от времени. Если больше какого-то времени - слать пинг. Тогда будет нагрузка еще меньше.
|
Ответ: Node.js тайм-аут соединения
Цитата:
|
Ответ: Node.js тайм-аут соединения
Цитата:
Но нагрузка на самом деле ничтожная, да и ping - это не отличимое сообщение от любых других, разница лишь в том что оно переодическое. Никакой маршрутизатор или провайдер не будет блочить подобный трафик, т.к. во первых с точки зрения сети - он редкий (раз в секунду), и с точки зрения данных, он не разлечим от остального трафика, и может быть на самом деле логикой, это было бы накладно и не целесообразно фильтровать и анализировать трафик чтобы что-то там блокировать на уровне сетевой инфраструктуры. |
Ответ: Node.js тайм-аут соединения
Это же ICMP протокол, TCP тут не при чем. Некоторые блочат ICMP-сообщения с типом 8(как раз пинг), правда нигде не видал чтобы блокировка производилась автоматически при флуде.
|
Ответ: Node.js тайм-аут соединения
2moka: DStalk уже ответил. Про icmp как часть стека TCP/IP я писал выше.
|
Ответ: Node.js тайм-аут соединения
Я не про настоящий пинг. А про обычное сообщение от сервера клиенту по установленному соединению. Если не слать пакеты с сервера на Node JS, то некоторые сокеты остаются в состоянии "подключен" пока реально не смогут передать данные и не вызовут исключение. Т.е. не приходит никаких эвентов что клиент отключился давно.
|
Ответ: Node.js тайм-аут соединения
Аналогично, речь и не шла о использовании низкого уровня ping'а. А речь идет о отсылке нормального сообщения, которое по логике приложение имеет роль heartbeat'а или ping'а.
|
Часовой пояс GMT +4, время: 20:51. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot