Это не то, как работают IOCP.
Если у вас есть ожидающие операции, которые вы хотите отменить, закройте соответствующий сокет, и операции будут либо завершены, либо завершатся с ошибкой, и все завершения (включая сбои) в конечном итоге выйдут из IOCP.
Вам нужно подождать, пока это произойдет, и как только это произойдет, вы можете отключиться.
Я стараюсь создать структуру «для каждого соединения», которая содержит сокет и используется в качестве ключа завершения. Затем у меня есть структуры «для каждой операции», которые включают OVERLAPPED
, а также подробную информацию о типе операции, используемом буфере ввода-вывода и других материалах. Обе эти структуры подсчитываются.
Когда операция инициируется, вы увеличиваете счетчик ссылок как на объект соединения, так и на объект операции. Когда вы получаете завершение, вы обрабатываете его, а затем уменьшаете счет. Когда счетчики достигают 0, вы не выполняете никакой работы с объектами, и они могут быть переработаны в пул для повторного использования.
Чтобы помочь в чистом завершении работы, у меня есть счетчик, который я могу ждать, который отслеживает количество «активных» объектов (сокетов) для каждого соединения.
Чтобы завершить работу, вы прерываете все соединения, а затем ждете, пока счетчик соединений не достигнет нуля. В этот момент все ваши объекты либо уничтожены, либо находятся в ваших бассейнах, и вы можете очистить их.
У меня есть пример кода, здесь, который представляет собой набор полнофункциональные примеры серверов IOCP, которые могут помочь - это рабочий код, через который вы можете пройти и почерпнуть идеи, если ничто иное.
person
Len Holgate
schedule
15.08.2013
OVERLAPPED
структуру (вам действительно следует использоватьWSAOVERLAPPED
, BTW) вstruct
, который также содержит исходныйSOCKET
, таким образом, когда происходит отключение, вы можете прокручивать свои элементы, которые находятся в процессе поиска отключенныхSOCKET
и тогда вы узнаете, какие предметы можно переработать. - person Remy Lebeau   schedule 24.05.2013struct
, вы можете добавить к немуbool
, чтобы отметить, когда он находится в пуле, затем вы можете проверить это значение при принятии решения о переработке или нет. - person Remy Lebeau   schedule 24.05.2013CancelIo/Ex()
? - person Remy Lebeau   schedule 25.05.2013