我在 Windows 上使用 IOCP。以前我使用方法GetQueuedCompletionStatus
来轮询队列,一切都很好。但是当我决定重构逻辑以使用完成例程WSARecv
调用时,它总是失败并出现错误WSAEINVAL
(10022)。此代码在创建的线程中CreateTread
int flags = 0;
m_iocport = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0);
handle = CreateIoCompletionPort(clientSocket, m_iocport, 0, 0);
OVERLAPPED_EX *over = new OVERLAPPED_EX();
result = WSARecv(clientSocket, &over->m_wsabuf, 1, NULL, &flags, over, WorkerRoutine);
并且工作例程是空的并且具有以下定义:
void static CALLBACK WorkerRoutine(DWORD Error, DWORD BytesTransferred, LPWSAOVERLAPPED Overlapped, DWORD InFlags) {}
当我传递NULL
而不是传递WorkerRoutine
给 WSARecv 方法时,一切正常。但是当我将完成例程传递给调用时,它失败并出现错误 10022。我尝试使用WorkerRoutine
但&WorkerRoutine
没有任何帮助。
该hEvent
属性在 OVERLAPPED_EX 对象中设置为 NULL。