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