Как удалить дескриптор из порта завершения ввода / вывода?
По моему опыту, вы не можете отсоединить дескриптор от порта завершения.Однако вы можете отключить уведомление о порте завершения, установив младший бит поля hEvent
структуры *1006*: см. Документацию для GetQueuedCompletionStatus .
Например,когда я добавляю сокеты в IOCP, как я могу удалить закрытые?Стоит ли просто перерегистрировать другой сокет с тем же ключом завершения?
Нет необходимости явно отсоединять дескриптор от порта завершения ввода-вывода;достаточно закрыть ручку.Вы можете связать несколько дескрипторов с одним и тем же ключом завершения;лучший способ выяснить, какой запрос связан с завершением ввода-вывода, - использовать структуру OVERLAPPED
.Фактически, вы можете даже расширить OVERLAPPED
для хранения дополнительных данных.
Кроме того, есть ли способ, чтобы вызовы ВСЕГДА проходили через порт завершения ввода-вывода ине возвращаться синхронно?
Это поведение по умолчанию, даже когда ReadFile
/ WriteFile
возвращает TRUE
.Вы должны явно вызвать SetFileCompletionNotificationModes , чтобы сказать Windows, чтобы не ставить в очередь пакет завершения при возврате TRUE
и ERROR_SUCCESS
.
возможно, например, recv
асинхронноно send
синхронно?
Не с помощью recv
и send
;вам нужно использовать функции, которые принимают OVERLAPPED
структуры, такие как WSARecv
, WSASend
или альтернативно ReadFile
и WriteFile
.Возможно, будет удобнее использовать последнее, если ваш код предназначен для работы с несколькими типами дескрипторов ввода / вывода, такими как сокеты и именованные каналы.Эти функции предоставляют синхронный режим, поэтому, если вы используете их, вы можете смешивать асинхронные и синхронные вызовы.
Что произойдет, если был запрошен асинхронный файл ReadFile, но до его завершения записать в тот же файл WriteFileфайл должен быть обработан?
Нет явной отмены.Пока вы используете отдельные структуры OVERLAPPED
для каждого чтения / записи на полнодуплексное устройство, я не вижу причин, по которым вы не можете выполнять параллельные операции ввода-вывода.