我正在尝试根据此示例使用重叠 io 来开发 req/res 服务器。
问题是同时可能有多个发送到同一个套接字,我无法将重叠结构传递WSAGetOverlappedResult
给正确管理发送事件。主循环如下所示:
while (TRUE) {
index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, TRUE);
if (index == WSA_WAIT_FAILED) {
printf("Wait failed w/err %d\n", WSAGetLastError());
continue;
}
index -= WSA_WAIT_EVENT_0;
if (!WSAEnumNetworkEvents(SocketArray[index]->Socket, EventArray[index], &NetworkEvents)) { // Multiple events max exist
if (NetworkEvents.lNetworkEvents & FD_ACCEPT)
ManageAccept(index, NetworkEvents);
if (NetworkEvents.lNetworkEvents & FD_READ)
ManageRead(index, NetworkEvents);
if (NetworkEvents.lNetworkEvents & FD_WRITE)
ManageWrite(index, NetworkEvents);
}
}
然后我将消息从方法发送ManageRead
到客户端套接字
WSASend(SocketArray[index]->Socket, &(over->wsabuf), 1, &SendBytes, 0, over, NULL)
当重叠发送完成时,我无法在方法中真正意识到ManageSend
哪些重叠结构是通过调用实际发送的WSAGetOverlappedResult
:
WSAGetOverlappedResult(SocketArray[index]->Socket, over, &SendBytes, FALSE, &flags)
我必须使用WorkerRoutine
临时来控制发送,但也许有人知道如何解决这个问题。或者可能有一些不同的方法可以返回已完成的重叠结构?