Порты завершения ввода-вывода - отправить или получить?

Если бы я написал программу, которая использовала порты завершения ввода-вывода для мультиплексирования с использованием неблокирующих сокетов, как бы я узнал, была ли передана функция, выполняемая в сокете, или recv, когда getQueuedCompletionStatus вернулось?

Заранее спасибо:)

2 ответа

Решение

Вы получаете указатель на структуру OVERLAPPED, которая использовалась для этой операции. Просто создайте другую структуру, которая содержит структуру OVERLAPPED, поэтому, когда вы получите OVERLAPPED в своем статусе завершения, вы можете превратить его в свою структуру:

struct MyOverlapped
{
    OVERLAPPED SystemOverlapped;
    int MyStuff;
    void* MoreStuffForMe;
};

Очевидно, что вы можете просто привести OVERLAPPED*, который вы получили, в MyOverlapped*, чтобы добраться до ваших полей. То, что вы вкладываете в свои поля, зависит от вас.

РЕДАКТИРОВАТЬ: наследование C++ тоже должно работать, так что вы также можете сделать

 struct MyOverlapped : public OVERLAPPED
 {
     ...
 };

О, я не знаю Поместите логическое значение в структуры буфера, которые передаются в инициирующих вызовах ReadFileEx, WriteFileEx. Что-то вроде того...

Другие вопросы по тегам