Как да разбера дали пакетът за завършване е за 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: да, точно така. Реймънд Чен описа тази функция в своя блог: Свързаният OVERLAPPED с асинхронен I/O се предава по адрес и можете да се възползвате от това   -  person Remy Lebeau    schedule 24.02.2015


Отговори (1)


Използвате „разширена“ OVERLAPPED структура, която съдържа друга информация. Често това също съдържа буфера за данни и някои флагове, които казват на извикващия GetQueuedCompletionStatus() какъв е типът завършване.

Има много полезни уроци за IOCP в мрежата и очаквам всички да обяснят това, тъй като е доста фундаментално. Моите уроци могат да бъдат намерени тук, заедно с някакъв код, който имплементира някои прости IOCP сървъри.

person Len Holgate    schedule 24.02.2015