c++ - WSARecv 如何使用 lpOverlapped?我怎样才能手动发出事件信号?

标签 c++ winsock

我需要弄清楚当 lpCompletionRoutine 为空时 WSARecv 如何使用 lpOverlapped 参数。它表示位于 lpOverlapped 的事件,对吧?但肯定不止于此。

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

当 lpOverlapped 被传递到 WSARecv 时,lpOverlapped->hEvent 为空。所以我不能简单地执行 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
}

最佳答案

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

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

关于c++ - WSARecv 如何使用 lpOverlapped?我怎样才能手动发出事件信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140695/

相关文章:

c++ - 返回一个 vector ,这里应用的是 RVO 还是 move 构造函数?

c++ - 如何使用新的 Visual Studio 2013 预览版构建 boost ?

c++ - 如何通过继承专门化复杂模板 - C++

c++ - Winsock 发送失败,错误 10093

c++ - 客户端断开连接后处理服务器应用程序中的线程

close() 与 shutdown() 和 receive()

c++ - 如何将枚举的 Qlist 从 C++ 公开到 QML?

c++ - 函数作为模板参数

c++ - 为什么在我的多人乒乓球游戏中对手的 Racket 滞后?

winapi - 如何区分 Win32 套接字句柄和其他管道句柄?