2011-01-08 2 views
1

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

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

+0

Возможно, ваше второе незавершенное соединение закрыто (во время отладки), и, похоже, было место для еще одного соединения? –

+0

Я так не верю. У меня есть точка останова, которая запускается через 5 секунд после попытки подключения. В этот момент, если я осмотрю все три сокета, все три имеют .Connected установлено значение true. – Sapph

ответ

0

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

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

+0

Только он работает почти каждый раз. Тест не срабатывает только изредка. Я спрашиваю, в каких обстоятельствах он может потерпеть неудачу. Как я уже сказал, меня не интересует запуск такого сервера в производственной среде. Вопрос в том, чтобы удовлетворить мое собственное любопытство. – Sapph

+0

@Sapph: Он может работать, но не по этой причине. Минимальное значение отставания в Windows - 5 (спецификация Winsock). И вы вряд ли можете назвать «неудачным только изредка» успешным. – EJP

+0

Хорошо, хорошо, можем ли мы попытаться выяснить, почему он работает большую часть времени? Является ли среда .NET попыткой обеспечить соблюдение отдельного предела программного обеспечения независимо от спецификации ОС? «Почему» - это вся суть этого вопроса. :) – Sapph

 Смежные вопросы

  • Нет связанных вопросов^_^