Порты завершения ввода-вывода - отправить или получить?
Если бы я написал программу, которая использовала порты завершения ввода-вывода для мультиплексирования с использованием неблокирующих сокетов, как бы я узнал, была ли передана функция, выполняемая в сокете, или recv, когда getQueuedCompletionStatus вернулось?
Заранее спасибо:)
2 ответа
Вы получаете указатель на структуру OVERLAPPED, которая использовалась для этой операции. Просто создайте другую структуру, которая содержит структуру OVERLAPPED, поэтому, когда вы получите OVERLAPPED в своем статусе завершения, вы можете превратить его в свою структуру:
struct MyOverlapped
{
OVERLAPPED SystemOverlapped;
int MyStuff;
void* MoreStuffForMe;
};
Очевидно, что вы можете просто привести OVERLAPPED*, который вы получили, в MyOverlapped*, чтобы добраться до ваших полей. То, что вы вкладываете в свои поля, зависит от вас.
РЕДАКТИРОВАТЬ: наследование C++ тоже должно работать, так что вы также можете сделать
struct MyOverlapped : public OVERLAPPED
{
...
};
О, я не знаю Поместите логическое значение в структуры буфера, которые передаются в инициирующих вызовах ReadFileEx, WriteFileEx. Что-то вроде того...