Как заставить Win32 Thread ждать в рабочей очереди и сокете? - PullRequest
2 голосов
/ 05 августа 2009

Мне нужен сетевой поток клиента, чтобы иметь возможность отвечать как на новые сообщения, которые должны быть переданы, так и на получение новых данных в сети. Я хочу, чтобы этот поток не выполнял цикл опроса, а обрабатывал его только по мере необходимости.

Сценарий выглядит следующим образом:

Клиентское приложение должно взаимодействовать с сервером по протоколу, который в значительной степени, но не полностью, является синхронным. Как правило, клиент отправляет сообщение на сервер и блокирует до получения ответа.

Сервер может обрабатывать клиентские запросы асинхронно, и в этом случае ответ клиенту это не результат, а уведомление о том, что обработка началась. Сообщение о результате отправляется клиенту в какой-то момент в будущем, когда сервер завершит обработку клиентского запроса.

Асинхронные уведомления о результатах могут поступать к клиенту в любое время. Эти уведомления необходимо обрабатывать, когда они получены, т. Е. Невозможно обработать невыполненное задание только после повторной передачи клиентом.

Клиентский сетевой поток получает и обрабатывает уведомления от сервера, а также передает исходящие сообщения от клиента.

Чтобы добиться этого, мне нужно активировать поток для выполнения обработки либо при получении сетевых данных, либо при передаче сообщения для передачи в очередь ввода.

Как поток может пробудиться, чтобы выполнить обработку поставленного в очередь рабочего элемента ИЛИ данных из сокета?

Меня интересует, прежде всего, использование простых Win32 API.

Хотелось бы получить минимальный пример или соответствующий урок!

Ответы [ 4 ]

5 голосов
/ 06 августа 2009

Альтернативой портам завершения ввода / вывода для сокетов является использование WSAEventSelect для привязки события к сокету. Затем, как уже говорили другие, вам просто нужно использовать другое событие (или какой-нибудь ожидаемый дескриптор), чтобы сигнализировать, когда элемент был добавлен в вашу очередь ввода, и использовать WaitForMultipleObjects для ожидания любого типа события.

2 голосов
/ 06 августа 2009

Следуя предложению Михаэля, у меня есть некоторый бесплатный код, который обеспечивает основу для сокетов в стиле IO Completion Port; и он также включает рабочую очередь на основе IOCP. Вы должны быть в состоянии взять некоторые вещи из него, чтобы решить вашу проблему с здесь .

2 голосов
/ 05 августа 2009

Вы можете настроить порт завершения ввода / вывода для дескрипторов, и ваш поток будет ожидать порта завершения:

На самом деле, вы можете иметь несколько потоков на порту (один поток на процессор обычно работает хорошо).

0 голосов
/ 05 августа 2009

Ну, если оба объекта имеют стандартные дескрипторы Windows, вы можете попросить клиента WaitForMultipleObjects ожидать их.

Возможно, вы захотите разделить обслуживание сетевого порта на свой собственный поток. Это может сильно упростить вещи. Однако, это не поможет, если вам просто придется синхронизировать что-то еще между этим новым потоком и вашим основным.

...