Удаление дескриптора из порта завершения ввода / вывода и другие вопросы о IOCP

Функция CreateIoCompletionPort позволяет создавать новый порт завершения ввода-вывода и регистрировать дескрипторы файлов для существующего завершения ввода-вывода. порт.

Затем я могу использовать любую функцию, например recv в сокете или ReadFile в файле со структурой OVERLAPPED , чтобы запустить асинхронная операция.

Я должен проверить, был ли вызов функции возвращен синхронно, хотя он был вызван со структурой OVERLAPPED , и в этом случае обработать его напрямую. В другом случае, когда возвращается ERROR_IO_PENDING , я могу использовать функцию GetQueuedCompletionStatus , чтобы получать уведомление о завершении операции.

Возникает вопрос:

  • Как можно Я снимаю дескриптор с порта завершения ввода-вывода? Например, когда я добавляю сокеты в IOCP, как я могу удалить закрытые? Должен ли я просто перерегистрировать другой сокет с тем же ключом завершения?

  • Кроме того, есть ли способ, чтобы вызовы ВСЕГДА проходили через порт завершения ввода-вывода и не возвращались синхронно?

  • И, наконец, возможно ли, например, для recv асинхронно, но для отправить синхронно? Например, если реализована простая эхо-служба: Могу ли я ждать с асинхронным recv новых данных, но отправлять ответ синхронным образом, чтобы упростить код? В моем случае я бы не стал recv во второй раз до обработки первого запроса.

  • Что произойдет, если был запрошен асинхронный ReadFile , но до его завершения, a WriteFile в тот же файл должен быть обработан. Будет ли ReadFile отменен с сообщением об ошибке, и мне придется перезапустить процесс чтения, как только запись будет завершена? Или мне нужно вручную отменить ReadFile перед записью? Этот вопрос возникает в сочетании с устройством связи; поэтому запись и чтение не должны вызывать проблем, если происходят одновременно.

7
задан Aaron Klotz 6 July 2011 в 19:22
поделиться