У меня есть сокет сервера, который я настроил так, чтобы разрешить одно соединение одновременно (путем блокировки вызовов Accept с семафором), с размером очереди невыполненных заданий 1. То есть я вызвал .Listen (1).
Затем я выполняю следующий процесс:
- Я вызываю 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, так как же время от времени успешно подключается третий клиент?
Пожалуйста, не говорите мне использовать больший размер очереди.Это для тестовой функции, которую я написал, а не для кода, который активно обслуживает клиентов.На данный момент это больше любопытства.:)