Как отличить, какая операция была завершена в потоке обработки IOCP?

Мое приложение может одновременно отправлять и получать данные от клиента с помощью WSASend и WSARecv. Итак, как определить, какая операция была завершена в потоке обработки IOCP (отправка или получение)?

BOOL bReturn = GetQueuedCompletionStatus(srv.m_hCompPort, &dwBytesTransfered, (LPDWORD)&lpContext, &pOverlapped, INFINITE);

Я думал, что могу использовать для этой цели структуру OVERLAPED, но не могу. Любая идея?

Спасибо!


person Tutankhamen    schedule 14.06.2013    source источник


Ответы (1)


Решение очень простое:

struct iOverlaped : public OVERLAPPED{
    enum Type {
        Send,
        Receive
    };
    iOverlaped(Type type_ ) {
        ZeroMemory(this, sizeof(iOverlaped));
        type = type_;
    }

    Type type;
};

И для каждого соединения мы должны создать два перекрывающихся экземпляра (по одному для каждого типа операции) ...

person Tutankhamen    schedule 14.06.2013
comment
На самом деле вам нужно создать один перекрывающийся экземпляр для каждой операции, которая будет активна одновременно. Так что, если вы когда-либо выполняете только чтение из завершенных операций записи и записи из завершенных операций чтения, то вам понадобится только одно. Если вы можете выполнять несколько операций чтения и записи одновременно, вам понадобится одна перекрывающаяся структура для каждого чтения и записи, которые могут быть активными. Ключевым моментом является то, что перекрывающиеся структуры относятся к данным каждой операции и сохраняются на протяжении всей операции и должны быть уникальными для каждой активной операции. - person Len Holgate; 15.08.2013