Как избежать, чтобы TCP Socket генерировал исключение SocketException при отключении? - PullRequest
2 голосов
/ 10 марта 2011

Я работаю над каким-то проектом на сервере C #, и он идет неплохо.

Сегодня я перешел с асинхронного чтения на обычное чтение с использованием опроса. Теперь, когда я читал async, это не было проблемой, но теперь это так.

Когда клиент отключается, сокет генерирует исключение SocketException, и это исключение вызывает довольно длительную задержку. Если я не перестану генерировать это исключение, весь сервер остановится примерно на полсекунды. И это может показаться не стоящим, но сервер получит довольно большое количество подключений и отключений, так что это действительно занимает слишком много времени.

Теперь я уже проверяю свойство Socket.Connected, которое возвращает true, но после метода read возвращает false.

Так кто-нибудь знает, как "обновить" состояние соединения, прежде чем пытаться его прочитать?

PS: Я ловлю исключение, просто задержка слишком велика.

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Похоже, что сокет читает из закрытого потока в какое-то время, может быть?
Я бы просто использовал второй поток или посмотрел, смогу ли я изменить время ожидания на 0 после отключения?

0 голосов
/ 10 марта 2011

В типичной разработке TCP неожиданное закрытие соединения должно быть исключительным случаем. Вам следует подумать о внедрении более изящной системы, в которой одна сторона сначала отправляет сообщение, указывающее, что она собирается отключиться, чтобы обе стороны могли затем закрыть соединение без сбоев.

Помните, что для определения того, закрыто соединение или нет, требуется действие. Согласно документам MSDN на Socket.Connected , это свойство отражает только то, было ли подключение подключено во время последней операции .

.

Если вы делаете что-то нетривиальное с этим, вы должны изолировать свои соединения с потоками (не обязательно по одному потоку на соединение, поскольку все, что связано с большим трафиком, быстро перегружает систему), но это не должно быть возможно для одно соединение для монополизации всего сервера, будь то длительная операция, инициированная соединением, или истечение времени ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...