2015-12-15 3 views
1

Я работаю с библиотекой узлов, которая явно не закрывает сокеты после того, как это делается с ними. Вместо этого он пытается очистить, удалив ссылку на сокет и позволяя им собирать мусор.Сокеты для сбора мусора в Node.JS

Googling не работает со мной: я не думаю, что GC может очистить незамкнутые розетки. То есть, я думаю, что любые дескрипторы сокетов будут по-прежнему использоваться с точки зрения ОС.

Кроме того, полагая, что я, как потребитель библиотеки, имею доступ к объектам сокета, что для меня лучший способ закрыть их? Я играл с end(), close() и destroy() с ограниченным успехом. Иногда они, похоже, блокируются на бесконечность (end/destroy), а в других случаях кажется, что обратный вызов никогда не делается (закрывается).

ответ

1

Возможно, это связано с тем, что ваш сокет отправил пакет FIN и повесил трубку на соединение, ожидая, пока другой конец отправит сообщение FIN2. В случаях, когда розетка с другой стороны не закрыта хорошо, ваш человек не получит никакой упаковки, таким образом, повесив навсегда.
Фактически, endsends a FIN packet и не отключает розетку.

Возможным решением может быть wait for a while on it с помощью setTimeout при вызове функции end, то explicitly destroy it с помощью функции destroy. Это не повлияет на ваш сокет, если другой конец правильно закрыл соединение, иначе он заставит отключить и все ресурсы будут освобождены.

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