Функция CreateIoCompletionPort
позволяет создавать новый порт завершения ввода-вывода и регистрировать дескрипторы файлов для существующего завершения ввода-вывода. порт.
Затем я могу использовать любую функцию, например recv
в сокете или ReadFile
в файле со структурой OVERLAPPED
, чтобы запустить асинхронная операция.
Я должен проверить, был ли вызов функции возвращен синхронно, хотя он был вызван со структурой OVERLAPPED
, и в этом случае обработать его напрямую. В другом случае, когда возвращается ERROR_IO_PENDING
, я могу использовать функцию GetQueuedCompletionStatus
, чтобы получать уведомление о завершении операции.
Возникает вопрос:
Как можно Я снимаю дескриптор с порта завершения ввода-вывода? Например, когда я добавляю сокеты в IOCP, как я могу удалить закрытые? Должен ли я просто перерегистрировать другой сокет с тем же ключом завершения?
Кроме того, есть ли способ, чтобы вызовы ВСЕГДА проходили через порт завершения ввода-вывода и не возвращались синхронно?
И, наконец, возможно ли, например, для recv
асинхронно, но для отправить
синхронно? Например, если реализована простая эхо-служба: Могу ли я ждать с асинхронным recv
новых данных, но отправлять
ответ синхронным образом, чтобы упростить код? В моем случае я бы не стал recv
во второй раз до обработки первого запроса.
Что произойдет, если был запрошен асинхронный ReadFile
, но до его завершения, a WriteFile
в тот же файл должен быть обработан. Будет ли ReadFile
отменен с сообщением об ошибке, и мне придется перезапустить процесс чтения, как только запись будет завершена? Или мне нужно вручную отменить ReadFile
перед записью? Этот вопрос возникает в сочетании с устройством связи; поэтому запись и чтение не должны вызывать проблем, если происходят одновременно.