У меня есть сокет сервера, который я настроил для разрешения одного соединения за один раз (блокируя приемочные вызовы с помощью семафора), с размером очереди в обратном порядке 1. То есть я позвонил .Listen (1)..NET Socket Listen backlog
я затем следовать следующий процесс:
- я называю AcceptAsync на мой сокет сервера (только один раз)
- У меня есть клиент ConnectAsync (подключается успешно)
- У меня есть клиент ConnectAsync (соединяется успешно, предположительно, в очереди ... способ сказать было бы неплохо)
- у меня есть третий клиент ConnectAsync
Эти три вызова ConnectAsync происходят быстро.
Ожидаемый результат для третьего ConnectAsync заключается в том, что свойство SocketError SocketAsyncEventArgs является чем-то иным, чем «SocketError.Success». Я действительно ожидаю «SocketError.ConnectionRefused», чтобы быть конкретным.
Около 95% времени, это так. Обратный вызов третьего клиента дает мне значение SocketError, отличное от Success.
Время от времени, однако, третий ConnectAsync «работает», точно так же, как и второй. EventArgs.SocketError дает мне SocketError.Success, а соответствующее свойство Socket.Connected читает «true».
Что происходит? Я называю AcceptAsync точно как только (я проверил это внимательно с точками останова), поэтому должен быть принят только один клиент, а остальное должно быть в очереди. Мой размер очереди равен 1, так как третий клиент подключается успешно и время от времени?
Пожалуйста, не говорите мне, чтобы использовать больший размер очереди. Это для тестовой функции, которую я написал, а не кода, который активно обслуживает клиентов. На данный момент это больше любопытства. :)
Возможно, ваше второе незавершенное соединение закрыто (во время отладки), и, похоже, было место для еще одного соединения? –
Я так не верю. У меня есть точка останова, которая запускается через 5 секунд после попытки подключения. В этот момент, если я осмотрю все три сокета, все три имеют .Connected установлено значение true. – Sapph