Сервер WebSocket, соединение принудительно закрыто удаленным хостом - PullRequest
0 голосов
/ 12 декабря 2011

Я работаю на сервере C # WebSocket (в настоящее время поддерживается http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17). Сервер работает с объектом Socket .NET для прослушивания сервером и для каждого клиента для отправки и получения сообщений.

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

Все работает отлично!

Теперь, если я 'm соединяясь с сервером и оставляя клиента некоторое время без отправки сообщений, сервер выдает исключение, которое говорит:

Int32 Send (Byte [], Int32, Int32, System.Net.Sockets.SocketFlags): существующее соединение было принудительно закрыто удаленным хостом.

Исключение, как вы можете видеть, из метода Send клиентского сокета на сервере, это выглядит очень проводным, потому что яне отправлял никаких данных от клиента и никто не отправлял данные этому клиенту обратно, так почему же метод Send может вызвать исключение и почему выбрасывается это исключение

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

Это называется тайм-аут!

WebSockets - это просто оболочка для необработанных сокетов TCP / IP ( Socket класс в .NET) - какой тайм-аут, если ничего не отправлено и ничего не сохраняетсясвязь жива.

AFAIK В настоящее время API WebSocket не очень хорошо определен в том, как поддерживать соединение активным.Я испытывал то же самое, и мне пришлось просто переключиться на использование ping (пустое сообщение), чтобы сохранить соединение (я использую реализацию сокетов Microsoft).

Если вы изобретаете зановоколесо для не окончательной спецификации, просто помните, что вам придется продолжать изобретать его каждый раз, когда меняется спецификация.Я специально решил использовать предварительный просмотр сокетов Microsoft, чтобы после его выпуска мне не пришлось менять код.Я не работаю в IIS - я работаю как консольное приложение, и оно пока работает в основном замечательно, но у меня очень мало пользователей.

Примечание. Проблема, с которой я столкнулся, заставила меня найти этот вопрос: если я отправлю 10 сообщений без ответа, соединение будет закрыто.Я все еще выясняю, почему это так - будь то ошибка / особенность WebSockets или особенность класса Socket.Возможно, я достигаю лимита в 65 Кб, но мои сообщения маленькие, и я не думаю, что именно поэтому.Просто знайте об этом при тестировании того, над чем вы работаете, потому что оно выдает ту же ошибку, что и вы.

0 голосов
/ 12 декабря 2011

Я предполагаю, что вы исключили использование разных протоколов между серверами и клиентами (глупое предположение, но вы никогда не знаете).

Если ваш код достигает метода Send без предварительного получения от клиента, тогда очевидно, что что-то не так с кодом сервера. Используйте трассировку и / или журнал, чтобы получить больше информации даже для букв, таких как ввод ожидания, получение, получение, получение, выход из получения и т. Д.

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