Я использую стандартные процедуры сокетов (socket, closesocket, bind, accept, connect ...) для создания / уничтожения и ReadFile / WriteFile для ввода-вывода, поскольку они позволяют использовать структуру OVERLAPPED.
После того, как ваш сокет принял или подключился, вы должны связать его с контекстом сеанса, который он обслуживает. Затем вы связываете свой сокет с IOCP и (в третьем параметре) предоставляете ему ссылку на контекст сеанса. IOCP не знает, что это за ссылка, и не заботится ни об этом. Ссылка предназначена для ВАШЕГО использования, поэтому, когда вы получаете IOC через GetQueuedCompletionStatus, переменная, на которую указывает параметр 3, будет заполнена ссылкой, чтобы вы сразу нашли контекст, связанный с событием сокета, и могли начать обслуживание события. Я обычно использую индексированную структуру, содержащую (среди прочего) объявление сокета, перекрывающуюся структуру, а также другие специфичные для сеанса данные. Ссылка, которую я передаю CreateIoCompletionPort в параметре 3, будет индексом элемента структуры, содержащего сокет.
Вам необходимо проверить, вернул ли GetQueuedCompletionStatus завершение или время ожидания. С тайм-аутом вы можете пройти через свою проиндексированную структуру и посмотреть (например), истек ли один из них или что-то еще, и предпринять соответствующие действия по ведению домашнего хозяйства.
Необходимо также проверить перекрывающуюся структуру, чтобы убедиться, что ввод / вывод выполнен правильно.
Функция, обслуживающая IOCP, должна быть отдельной многопоточной сущностью. Используйте столько же потоков, сколько у вас ядер в вашей системе, или, по крайней мере, не больше, поскольку это приводит к потере системных ресурсов (у вас нет больше ресурсов для обслуживания события, чем количество ядер в вашей системе, верно?) .
IOCP действительно лучшие из всех миров (слишком хороши, чтобы быть правдой), и любой, кто говорит «один поток на сокет» или «ждать в списке с несколькими сокетами в одной функции», не знает, о чем идет речь. Первый подчеркивает ваш планировщик, а второй - опрос, а опрос ВСЕГДА крайне бесполезен.