将 WaitForMultipleObjects() 与 ACE_SOCK_Stream 一起使用 - 仅在有数据时获取事件

Using WaitForMultipleObjects() with ACE_SOCK_Stream - get event only when there's data

是否可以将 WaitForMultipleObjects() 与 ACE_SOCK_Stream 一起使用,并使其 return 仅在有数据可读时使用?

我尝试以下:

    // set some params
    DWORD handlesCount = 1;
    DWORD timeoutMs = 5 * 1000;
    HANDLE* handles = new HANDLE[handlesCount]; 
    handles[0] = sock_stream.get_handle();

    while (true) {
        int ret = WaitForMultipleObjects(handlesCount, handles, false, timeoutMs);
        std::cout << "Result: " << ret << std::endl;

但是 WaitForMultipleObjects() return 立即是套接字流索引,表明它已准备就绪(它在无限循环中打印 0)。

通过 ACE_SOCK_Acceptor (ACE_SOCK_Acceptor->accept()) 接受套接字。

如何让 WaitForMultipleObjects() 等到套接字有数据要读取?

套接字句柄不适合在 WFMO 中使用。您应该使用 WSAEventSelect 将所需事件与向 WFMO 注册的事件句柄相关联。

由于您也熟悉 ACE,因此您可以查看 ace/WFMO_Reactor.cpp、register_handler() 方法的源代码以查看用例以及它如何与 WFMO 一起工作。