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