Boost :: Beast Non Blocking Читать для веб-сокетов?

У нас есть приложение, которое полностью синхронно, и всегда будет так, потому что это в основном интерпретатор командной строки для отправки команд низкого уровня на наше оборудование, и вы не можете иметь две команды, идущие на оборудование одновременно. У меня будет только 1 клиентский сокет для этой конфигурации, работающий синхронно, одна команда серверу, она обращается к оборудованию и отправляет значение обратно клиенту, но, насколько я вижу, в настоящее время async_read — единственный способ сделать это. неблокирующие чтения.

Каков наилучший способ получить неблокирующее чтение / запись через Beast? Например, в TCP и Serial в Windows у вас есть способы заглянуть в буфер, чтобы увидеть, готовы ли данные к доступу, и если есть, вы можете выполнить команду чтения, зная, что она не заблокируется, потому что данные есть. Не уверен, что мне просто не хватает этой функциональности в Beast, хотя я скажу, что иметь такую ​​функциональность по возможности было бы неплохо.

В любом случае, поэтому на основании этого у меня есть вопрос

Во-первых, могу ли я взять пример Coroutine и вместо того, чтобы использовать yield, создать и передать ему функцию read_handler?

Я взял пример сопрограммы, встроил функции в свой класс и использовал точно такой же read_handler из ответа этого потока.
Как передать обработчик чтения в async_read для веб-сокета Beast?

Он компилируется, как он говорит, но установка точки останова никогда не срабатывает при получении данных.

Мне действительно не нужна полная асинхронная функциональность, такая как пример асинхронной передачи, которая проталкивает ее в разные потоки, фактически это усложняет мою жизнь, потому что остальная часть приложения не является асинхронной. И поскольку мы разрешаем ввод из различных источников (клавиатура / TCP / Serial / File), мы не можем блокировать ожидание данных.

1

Решение

Каков наилучший способ получить неблокирующее чтение / запись через Beast?

Из-за способа реализации потока websocket невозможно поддерживать неблокирующие режимы сокетов.

я могу взять пример Coroutine и вместо того, чтобы использовать yield, создать и передать ему функцию read_handler?

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

0

Другие решения

Сопрограммы имеют блокирующую семантику, а обработчики завершения — нет. Если вы попытаетесь использовать пример сопрограммы и замените выражение yield на обработчик завершения, вызов инициирующей функции не будет блокировать то, что происходит при использовании сопрограмм. И вы не должны использовать спавн. Вы сказали, что пример сопрограммы намного проще, вероятно, потому, что он похож на синхронный код. Если вам нужна простота написания и понимания, вам придется использовать сопрограммы. Код, использующий обработчики завершения, будет демонстрировать «инверсию управления», обычно связанную с обратными вызовами. Это присуще тому, как они работают, а не то, что вы можете изменить, просто начав с кода, который использует сопрограммы, и изменив маркер завершения.

0

По вопросам рекламы [email protected]