Журнал ожидания .NET Socket - PullRequest
       23

Журнал ожидания .NET Socket

1 голос
/ 08 января 2011

У меня есть сокет сервера, который я настроил так, чтобы разрешить одно соединение одновременно (путем блокировки вызовов 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, так как же время от времени успешно подключается третий клиент?

Пожалуйста, не говорите мне использовать больший размер очереди.Это для тестовой функции, которую я написал, а не для кода, который активно обслуживает клиентов.На данный момент это больше любопытства.:)

1 Ответ

0 голосов
/ 11 января 2011

Это не сработает.Система увеличит ваш резерв ожидания на 1 до своего собственного минимума, который будет по крайней мере 50.

Просто сделайте ваш сервер однопоточным.Тогда он будет обрабатывать только одно соединение за раз.Последующие соединения будут ожидать в очереди невыполненных работ.Когда очередь невыполненных заданий заполнена, они получат сообщение «отказано в соединении» , если сервер является платформой Windows.Не иначе.

...