无法将OVERLAPPED对象传递给WSAGetOverlappedResult

时间:2017-10-25 06:37:30

标签: c++11 client-server winsock2 overlapped-io

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

0 个答案:

没有答案