Согласно MSDN :
hEvent: если операция ввода-вывода с перекрытием выполняется без процедуры завершения ввода-вывода (параметр операции lpCompletionRoutine имеет значение null), то этот параметр должен содержать действительный дескриптор объекта WSAEVENT или быть нулевым.
Поскольку я использую 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?