WSARecv如何使用lpOverlapped?如何手动发出事件信号?

时间:2011-08-21 19:51:38

标签: c++ winsock

当lpCompletionRoutine为null时,我需要弄清楚WSARecv如何使用lpOverlapped参数。它标志着位于lpOverlapped的事件,对吗?但必须有更多的东西。

我正在拦截正常的WSARecv调用,所以我可以记录数据包,我可以很好地捕获数据,但客户端挂起并等待被告知recv操作已完成。我根本不确切知道真正的WSARecv函数用lpOverlapped做什么来通知客户端操作已完成。

当lpOverlapped传递给WSARecv时,lpOverlapped-> hEvent为null。所以我不能简单地做SetEvent()或WSASetEvent()。我可以通过执行类似lpOverlapped-> hEvent = WSACreateEvent()的操作来创建事件,然后设置事件,客户端似乎仍然不会确认它。

感谢任何帮助。

谢谢!

编辑:我正在为WSARecv调用做什么的示例

    int proxyWSARecv(int unused, SOCKET s, LPWSABUF recvBuffer, DWORD bufferCount, LPDWORD bytesRecvd, LPDWORD flags,
    LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine){


    WSAOVERLAPPED wsaoverlapped;
    LPWSAOVERLAPPED ourOverlapped = &wsaoverlapped;
    WSADATA wsaData;
    int rc = WSAStartup(MAKEWORD(2, 2), &wsaData);

    int retnVal;

    __asm{
        push lpCompletionRoutine
        push ourOverlapped // our replacement lpoverlapped
        push flags
        push bytesRecvd
        push bufferCount
        push recvBuffer
        push s
        call p_WSARecv // real WSARecv
        mov retnVal, EAX
    }

    // get overlapped results and log packets here. etc
}

1 个答案:

答案 0 :(得分:0)

在设置重叠结构时,您必须手动创建(并稍后关闭)事件。该事件由操作系统设置 - 您只需等待或检查它。

如果重叠结构的事件为NULL,您仍然可以使用套接字本身等待套接字事件。