Журнал ожидания прослушивания - , как сказал Питер , - очередь, которая используется операционной системой для хранения соединений, которые были приняты стеком TCP, но еще не приняты вашей программой. Концептуально, когда клиент подключается, он помещается в эту очередь, пока ваш код Accept()
не удалит его и не передаст вашей программе.
Таким образом, журнал ожидания прослушивания является параметром настройки, который может использоваться, чтобы помочь вашему серверу обрабатывать пики при одновременных попытках подключения. Обратите внимание, что это связано с пиками при одновременных попытках подключения и никоим образом не связано с максимальным количеством одновременных подключений, которое может поддерживать ваш сервер. Например, если у вас есть сервер, который получает 10 новых подключений в секунду, то маловероятно, что настройка невыполненных запросов на прослушивание окажет какое-либо влияние, даже если эти подключения являются долгоживущими, а ваш сервер поддерживает 10 000 одновременных подключений (при условии, что ваш сервер не работает на максимальном уровне) из процессора, обслуживающего существующие соединения!). Однако, если сервер периодически испытывает короткие периоды, когда он принимает 1000 новых подключений в секунду, вы, вероятно, можете предотвратить отклонение некоторых подключений, настроив журнал ожидания прослушивания, чтобы обеспечить большую очередь и, следовательно, дать вашему серверу больше времени для вызова Accept()
за каждое соединение.
Что касается плюсов и минусов, то плюсы состоят в том, что вы можете лучше обрабатывать пики при одновременных попытках соединения, и соответствующее обстоятельство заключается в том, что операционной системе необходимо выделять больше места для очереди прослушивания, поскольку она больше. Таким образом, это производительность против компромисса ресурсов.
Лично я создаю прослушивание, которое можно настроить внешне через файл конфигурации.
Как и когда вы вызываете listen и accept, зависит от стиля кода сокетов, который вы используете. В синхронном коде вы вызывали бы Listen()
один раз со значением, скажем, 10, для своего журнала ожидания прослушивания, а затем вызывали цикл Accept()
. Призыв к прослушиванию устанавливает конечную точку, к которой ваши клиенты могут подключиться, и концептуально создает очередь невыполненных заданий прослушивания указанного размера. Вызов Accept()
удаляет ожидающее соединение из очереди прослушивания, настраивает сокет для использования приложения и передает его в ваш код как вновь установленное соединение. Если время, необходимое вашему коду для вызова Accept()
, обработайте новое соединение и повторите цикл для повторного вызова Accept()
дольше, чем разрыв между одновременными попытками подключения, тогда вы начнете накапливать записи в очереди ожидания ожидания.
В случае асинхронных сокетов все может быть немного по-другому, если вы используете асинхронный прием, вы будете прослушивать один раз, как и раньше, а затем публиковать несколько (снова настраиваемых) асинхронных приемов. По завершении каждого из них вы обрабатываете новое соединение и публикуете новое асинхронное подтверждение. Таким образом, у вас есть очередь прослушивания невыполненных заданий и ожидающая принятия очередь, поэтому вы можете принимать соединения быстрее (более того, асинхронные приемы обрабатываются в потоках пула потоков, поэтому у вас нет единого жесткого цикла принятия). Обычно это более масштабируемо и дает две точки для настройки для обработки большего количества одновременных попыток подключения.