Как узнать, предназначен ли пакет завершения для WSASend(), WSARecv() или AcceptEx()?

Когда я вызываю WSASend() или WSARecv() или AcceptEx(), пакет завершения будет помещен в порт завершения, и я могу удалить его из очереди, используя GetQueuedCompletionStatus(). Но как я могу узнать, какую операцию представляет этот пакет завершения?


person Community    schedule 24.02.2015    source источник
comment
Сравните указатель LPOVERLAPPED, который вы получили от GetQueuedCompletionStatus, с указателем, который вы передали WSASend и другим. Вы также можете добавить дополнительных членов в конец структуры, чтобы спрятать дополнительную информацию.   -  person Igor Tandetnik    schedule 24.02.2015
comment
Итак, я могу добавить элемент char в конец структуры, который будет содержать тип операции, например: «S», «R», «A»? (это кажется лучшей альтернативой сравнению указателей!)   -  person    schedule 24.02.2015
comment
@ user4592590: да, точно. Рэймонд Чен описал эту функцию в своем блоге: с асинхронным вводом-выводом передается по адресу, и вы можете воспользоваться этим   -  person Remy Lebeau    schedule 24.02.2015


Ответы (1)


Вы используете «расширенную» структуру OVERLAPPED, которая содержит другую информацию. Часто он также содержит буфер данных и некоторые флаги, которые сообщают вызывающей стороне GetQueuedCompletionStatus() тип завершения.

В Интернете есть много полезных руководств по IOCP, и я ожидаю, что все они объяснят это, поскольку это довольно фундаментально. Мои руководства можно найти здесь вместе с некоторым кодом, реализующим несколько простых серверов IOCP.

person Len Holgate    schedule 24.02.2015