При использовании IOCP следует ли устанавливать для hEvent WSAOVERLAPPED значение NULL или допустимый дескриптор объекта WSAEVENT?

Согласно MSDN:

hEvent: If an overlapped I/O operation is issued without an I/O completion routine (the operation's lpCompletionRoutine parameter is set to null), then this parameter should either contain a valid handle to a WSAEVENT object or be null.

Поскольку я использую IOCP, когда я вызываю WSASend ()или WSARecv (), я передаю NULL их последнему параметру (, то есть lpCompletionRoutine ):

WSASend(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, pIoRequest->GetFlags(), pIoRequest, NULL);

WSARecv(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, &(pIoRequest->GetFlags()), pIoRequest, NULL);

. Мой класс «для данных ввода-вывода» (pIoRequest )выглядит примерно так:

class IoRequest : public WSAOVERLAPPED
{
public:
    IoRequest()
    {
       ...
        SecureZeroMemory(this, sizeof(WSAOVERLAPPED));
        hEvent = WSACreateEvent(); // A
    }
   ...
    void ResetForNextIoRequest()
    {
        WSACloseEvent(hEvent); // B
        SecureZeroMemory(this, sizeof(WSAOVERLAPPED));
        hEvent = WSACreateEvent(); // C
       ...
    }
   ...
    DWORD& GetFlags() { return m_dwFlags; }
   ...
private:
   ...
    DWORD m_dwFlags;
   ...
};

Кажется, это не имеет никакого значения для поведения моей программы, даже если я закомментирую строки, отмеченные выше A, B и C.

Так как же решить, когда вызывать WSACreateEvent ()или просто установить для hEvent значение NULL?

5
задан jpen 6 August 2012 в 16:03
поделиться