Странные проблемы с сокетами - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть сервер, который я написал, используя асинхронные сокеты. В части, которая принимает новые подключения, у меня возникает проблема, когда некоторые пользователи говорят, что иногда они получают эту ошибку на сервере, когда клиент пытается повторно подключиться к серверу:

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

После возникновения этой ошибки сервер перестает работать, и новые клиенты не могут подключиться, пока я физически не закрою серверную программу и не запустлю ее снова. Так что мне делать, когда я получаю эту ошибку? Я попытался по существу перезапустить сервер в своем коде, закрыв сокет (listener.Close ()), а затем вызвав тот же код, который я использовал для создания и привязки к сокету в начале, но затем я получаю сообщение об ошибке, говорящее, что я могу не привязывать к тому же порту снова.

Итак, два вопроса. Во-первых, как правильно обработать эту ошибку и не допустить, чтобы она по существу убила мой сервер? Далее, как правильно перезапустить сервер через мой код? В этом случае просто не работает .close () для слушателя, а затем запускает его снова.

Спасибо

Вот код, принимающий запрос на соединение

Закрытый запрос Sub connection (ByVal ar As IAsyncResult)

    Try

        Dim thisListener As Socket = CType(ar.AsyncState, Socket)

        Dim handler As Socket = thisListener.EndAccept(ar)

        Dim remoteEndPoint As IPEndPoint

        remoteEndPoint = handler.RemoteEndPoint

        thisListener.Listen(10)

        thisListener.BeginAccept(New AsyncCallback(AddressOf connectionRequest), thisListener)

        thisListener.NoDelay = True

        thisListener.Ttl = 32

        Dim state As New StateObject

        state.workSocket = handler

        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf dataArrival), state)

        handler.NoDelay = True

    Catch ex As Exception

    End Try

End Sub

1 Ответ

0 голосов
/ 02 ноября 2010

Не могли бы вы показать нам код, который у вас есть для принятия соединений?

Вам не нужно перезагружать сервер. Вам просто нужно исправить ошибку в вашем коде принятия на вашем сервере.

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

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