我试图根据this example使用重叠的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
临时来控制发送,但也许有人知道如何解决这个问题。或者是否有一些不同的方法可以返回已完成的重叠结构?