Можно ли использовать WaitForMultipleObjects () с ACE_SOCK_Stream и заставить его возвращаться только тогда, когда есть данные для чтения из него?

Я пробовал следующее:

    // 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 () немедленно возвращает индекс потока сокета, указывая, что он готов (он печатает 0 в бесконечном цикле).

Сокет принимается через ACE_SOCK_Acceptor (ACE_SOCK_Acceptor-> accept ()).

Как заставить WaitForMultipleObjects () ждать, пока сокет не получит данные для чтения?

0
Ronen Ness 16 Апр 2018 в 18:58

1 ответ

Лучший ответ

Ручка гнезда не подходит для использования в WFMO. Вам следует использовать WSAEventSelect , чтобы связать желаемое событие (я) с дескриптором события, зарегистрированным в WFMO.

Поскольку вы также знакомы с ACE, вы можете проверить исходный код метода ace / WFMO_Reactor.cpp, register_handler (), чтобы увидеть вариант использования и то, как он работает с WFMO.

2
Steve Huston 17 Апр 2018 в 16:45