Возможно ли использовать IOCP (или другой API) в операциях в стиле реактора?

StackOverflow https://stackoverflow.com/questions/2530625

Вопрос

Существует ли какой-либо масштабируемый Win32 API (например, IOCP, а не select), который предоставляет вам стиль reactor операции с сокетами?AFAIK IOCP позволяет получать уведомления о выполненных операциях например, о чтении или записи данных (proactor), но я ищу стиль операций reactor:Мне нужно получать уведомления, когда сокет доступен для чтения или записи (reactor).

Что-то похожее на epoll, kqueue, /dev/poll ?

Есть ли такой API в Win32?Если да, то где я могу найти руководство по этому вопросу?

** Уточнение: ** Мне нужно select например, api для сокетов, который является таким же масштабируемым, как IOCP, или я ищу способ использовать IOCP в операциях, подобных реактору.

Еще больше разъяснений: IOCP позволяет вам получать уведомления о завершении данной операции.Например:

WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done

Итак, я получаю уведомление после операция выполнена - прокторский стиль ведения операций.

Что мне нужно, так это что-то вроде этого:

WSARecv( NOTHING ); // start waiting for readability (not actual read)
WSAWaitForMultipleEvents(...); // wait until read would not block
// Now WSARecv would not block
WSARecv(buffer,...); // now actual non-blocking read

Как я могу это сделать?

Это было полезно?

Решение 3

Это невозможно.

Я проверил Boost.Исходники Asio, которые работают в стиле reactor и используют IOCP.Для всех операций в стиле реактора отдельный поток с select используется вместо IOCP.

Другие советы

Вы хотите взглянуть на Выбор WSAAsyncSelect API.Он использует очередь сообщений Windows, чтобы сигнализировать о том, что дескриптор прочитан для чтения / записи / чего угодно, поэтому у него нет преимуществ параллелизма IOCP, но он позволяет вам реализовать стандартный шаблон reactor без ограничения количества дескрипторов (например WSAWaitForMultipleEvents).

Я в замешательстве, разве это не шаблон Reactor, где поток блокирует ожидание от нескольких источников событий?Это был бы select (), который поддерживает Windows.Шаблон Proactor - это когда для каждого вызова выполняется один обратный вызов, который вы можете выполнить через ReadFileEx / WriteFileEx .

Вы пробовали передавать нулевое значение nNumberOfBytesToRead, например, в ReadFile(socket_fd, ..)?

Возможно, это поможет получить событие "read ready".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top