Возможно ли использовать IOCP (или другой API) в операциях в стиле Reactor? - PullRequest
2 голосов
/ 27 марта 2010

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

Что-то похожее на 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

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

Ответы [ 4 ]

1 голос
/ 28 марта 2010

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

0 голосов
/ 10 июня 2010

Вы пытались передать ноль nNumberOfBytesToRead, например, ReadFile (socket_fd, ..)?

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

0 голосов
/ 28 марта 2010

Не возможно.

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

0 голосов
/ 27 марта 2010

Я в замешательстве, разве шаблон Reactor не блокирует поток, ожидающий несколько источников событий? Это было бы выбрать (), который поддерживает Windows. В шаблоне Proactor существует один обратный вызов на вызов, который вы можете сделать через ReadFileEx / WriteFileEx.

...