если использовать IOCP при обработке сокетов, то во многих примерах, в том числе и Jim Ohlund рекомендуют создать объект — структуру типа PER_HANDLE и ее адрес передавать в качестве CompletionKey при вызове CreateIoCompletionPort.
такой вопрос: а когда же удалять созданный объект?
что меня смущает — это то, что на один сокет может быть задействовано одновременно несколько асинхронных операций. если закрыть сокет, то GetQueuedCompletionStatus сработает несколько раз (для каждой операции). пока все overlapped не обработаются и не удалятся вроде бы как нельзя удалять эту PER_HANDLE.
а как отследить момент, что все операции по закрытому сокету закончились?
неужели безопасно через CompletionKey передавать только простые значения, которые помещаются в PULONG_PTR ?