Я связываю HANDLE «h_server», который я создаю с CreateNamedPipe (), с портом завершения ввода / вывода, и
для ключа завершения я использую указатель функции: namedpipe_server_completion_routine ().
Теперь, когда инициируется запрос клиентского соединения по именованному каналу, этот HANDLE «h_server» стал конечной точкой клиента.
в приложении сервера именованных каналов, поэтому я должен изменить его ключ завершения ввода / вывода на другой тип указателя процедуры, который выполняет ввод / вывод, чтение, запись и т. д., io_arrival_completion_routine (), который отличается от завершения сервера именованного канала рутина.
Я подумал снова вызвать CreateIoCompletionPort () с новым ключом завершения для этой РУЧКИ, но, кажется, он не работает, так что есть способ изменить этот ключ? Может быть, с некоторыми хаки с DuplicateHandle или что-то?
Если нет, то как я мог решить это?
ПРИМЕЧАНИЕ: эта проблема присутствует только с именованными конвейерными серверами, потому что AcceptEx () работает по-другому: с tcp-серверами, когда соединение приходит, вы в основном получили новый HANDLE для конечной точки клиента на сервере, так что вы можете связать это новый ОБРАЩАЙТЕСЬ с портом завершения io и правильным ключом завершения в качестве правильного io_arrival_completion_routine (), в то время как HANDLE tcp-сервера, связанного с tcp_server_completion_routine (), останется верным, и его уникальная роль будет заключаться в прослушивании новых соединений.
Измените ключ завершения с указателя на функцию на указатель на блок данных. Этот блок данных может включать любую необходимую информацию о статусе.
В простейшем случае блок данных будет просто содержать указатель на функцию, которую вы сейчас пытаетесь использовать в качестве ключа завершения.
Других решений пока нет …