CSocket не получает OnClose или onReceive при отключении сетевого подключения на стороне клиента
-
19-09-2019 - |
Вопрос
Я создал клиент-серверное приложение с помощью c ++ CSocket.когда я подключаю клиент к серверу и после этого закрываю клиент обычной кнопкой X или завершаю выполнение задачи с помощью taskmanager , сервер CSocket получает событие OnClose.Проблема в том, что когда я отключаю подключение к Интернету в Windows, на которой запущен клиент, сервер CSocket не получает событие OnClose или onReceive!
Кто-нибудь, возможно, знает, что происходит?
Обновить:Я только что протестировал и увидел, что клиент тоже не получил OnClose!Я отключил подключение к Интернету в Windows, на которой запущен клиент!
Решение
Клиентская сторона завершает работу без возможности закрыть соединение с сервером через FIN или RST.Чтобы сервер обнаружил, что клиент мертв, у него должны быть либо данные для отправки (что приведет к сбою), либо он должен периодически отправлять запросы TCP keepalive. TCP_KEEPALIVE
может быть установлен в качестве опции сокета.