根据MSDN:
hEvent:如果在没有 I/O 完成例程的情况下发出重叠 I/O 操作(操作的 lpCompletionRoutine 参数设置为 null),则此参数应包含 WSAEVENT 对象的有效句柄或为 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);
我的“每个 I/O 数据”类 (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?