Я разрабатываю сервер на C #, который может принимать только одного клиента, и мне нужно знать, когда этот клиент отключен, чтобы иметь возможность принимать другие запросы на подключение.
Я использую первый сокет, который постоянно прослушивает запрос на соединение с Socket.BeginAccept
и принимает или отклоняет клиентов. Когда клиент принят, новый Socket, который возвращается Socket.EndAccept
, используется для связи между клиентом и сервером. Затем сервер ждет команд от клиента с Socket.Begin/EndReceive
и отправляет ответы. Сервер использует протокол, подобный Telnet, что означает, что каждая команда и каждая строка ответа должны заканчиваться на \r\n
.
Чтобы определить, был ли клиент отключен, я установил таймер, который каждые 500 мс отправляет клиенту пустое сообщение («\r\n
»). Если клиент отключен, Socket выдает исключение. Это исключение перехватывается сервером, который закрывает текущий сеанс и принимает новое соединение. Это надежное решение, но подразумевает ненужный трафик по сети и должно правильно обрабатываться клиентом, который должен фильтровать фиктивные сообщения перед получением фактического ответа.
Я пытался отправить пустой буфер (Socket.Send(new byte[1], 0, 0)
), но похоже, что он не работает в направлении сервер-> клиент.
Другим решением может быть случай, когда Socket.EndReceive
возвращает 0 байт. Он отлично работает в случае отключения, которое происходит во время "простоя". Но если клиент отключается во время передачи сообщения, сервер не всегда его видит и ждет бесконечно.
Я уже видел несколько тем и вопросов по этой проблеме, но никогда не видел хорошего решения.
Итак, мой вопрос: как лучше всего обнаружить отключение в .Net?