WinSock как на сервере узнать, что клиент отключился
Собственно, вопрос в заголовке. Есть ли у winsock какой-то способ узнать, что от сокета отключились, или это необходимо писать самому?
Ответы (2 шт):
Есть только один надежный способ - послать что то и дождаться ответа. Эту команду можно внести прямо в команды протокола. Обычно это называют ping-pong. К примеру, в Jabber прям так и сделано.
Собственно в сокетах можно ещё поиграть Keep-Alive, но там иногда не все так очевидно https://rsdn.org/article/net/keep_alive.xml
Стандартная ситуация описана, у примеру, в мануале мелкомягких. Но это описано - как быть должно. Но на практике не всегда так бывает. Многие файрволы вообще не отвечают в ряде случаев, а просто "дропают" пакеты (одна из методик противодействия DDOS-атакам). Поэтому самый надежный случай, ИМХО, это - дожидаться факта закрытия коннекта за определенный промежуток времени. Если промежуток времени прошел, и никаких ответов не было - смело считать, что коннект уже сброшен.