другие ответы в этой теме полностью законны, но я считаю, что могу немного добавить к этому.
Давайте обсудим, что такое порт завершения, как я его понимаю.
Порт завершения — это приемник событий. То есть происходит событие, порт завершения получает уведомление.
Конечно, существует большая классификация событий. Порт завершения хорошо подходит для событий определенного типа: завершения ввода-вывода. Существует патент Катлера и банды, написанный удивительно понятным для человека языком и описывающий, как IOCP интегрируется с ядром NT.
Подводя итог: порт завершения — это приемник событий, хорошо подходящий для получения уведомлений о завершении ввода-вывода.
Теперь вернемся к вопросу ОП:
Как настроить сокеты IOCP для нескольких прослушивателей (на разных портах)?
Ваше событие является завершением ранее выполненного вызова AcceptEx(). Обычно это вызов connect() на стороне клиента, но также может быть кто-то отключающий вашу сетевую карту.
сначала вы решаете, хотите ли вы, чтобы соединения на одном и том же порту обрабатывались одновременно или последовательно. Также вам нужно решить, хотите ли вы, чтобы соединения на разных портах обрабатывались одновременно или последовательно.
Я вижу три возможных подхода:
- все завершения подключения сериализуются
CreateIOCompletionPort предварительно один раз, BindIOCompletionCallback для каждого слушателя, один рабочий поток, который вызывает GetQueuedCompletionStatus, как описано RbMm
- завершение соединения одного и того же прослушивателя (на одном порту) сериализуется, но завершение соединения на разных портах выполняется одновременно.
вам нужно создать один порт завершения для каждого слушателя и запустить работника, который будет GetQueuedCompletionStatus()
- все завершения соединения являются параллельными
У вас может быть один порт завершения, но вы запускаете несколько потоков для вызова GetQueuedCompletionStatus().
Вы не обязательно ограничены наличием бедер, как я описал выше. Порты завершения умны, поэтому вы можете использовать один порт и несколько официантов, а затем официанты получают блокировки для каждого прослушивателя для сериализации. Механизм порта завершения в ядре обнаружит, что вы заблокировали, и освободит других ожидающих, когда это необходимо.
Резюмируя: во-первых, вы решаете, насколько одновременным вы хотите быть. Затем вы выбираете, сколько портов завершения вам нужно иметь.
person
Sergei Vorobiev
schedule
27.03.2017