问题标签 [boost-beast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
370 浏览

boost-asio - io_context::strand 可以保证 async_* 完成处理程序和自定义函子之间的顺序吗?

我有这种情况,我需要在调用一个自定义函数之前“准备”一个 async_read 操作以进行读取,该函数在 websocket 的对应部分发送一些东西。我将 async_read 的完成处理程序包装在我发布仿函数的同一链中。

问题是有时 on::read 没有被调用,所以基本上我认为 writeFromCounterpart() 在 ws_1 处于“读取”状态之前被调用。

我的理解是 strand 保证了完成处理程序之间的顺序,但我不明白是否保证 async_* 操作在继续从 strand FIFO 进行其他操作之前“准备好”(在其线程中运行并读取)。

完整代码如下:运行它时,大多数时候我看到以下输出:

我也能看到以下几次(在压力条件下,大约 20 人中有 1 人),

我从未见过 on_write 和 on_read

代码:

0 投票
1 回答
537 浏览

c++ - 未定义符号 boost::system:detail::system_category_instance

在编译使用beastasio的游乐场程序时,我在 macOS Mojave 上使用 c++17 标准和 clang 构建了 boost,但出现以下错误:
在此处输入图像描述

这是我的制作文件:

我已经使用本教程中描述的步骤编译了 boost: 使用 Clang 编译 Boost

Clang 版本:
Apple LLVM 版本 10.0.0.0 (clang-1000.11.45.5)
目标:x86_64-apple-darwin18.2.0

还有什么我需要考虑的吗?我已经阅读了很多帖子等,建议在项目本身中使用的相同 c++ 标准中编译 boost。

编辑:
Matthieu Brucher 的变量名提示(Boost_ vs. BOOST_)起到了作用。现在它正在工作。

0 投票
1 回答
335 浏览

c++ - bad_weak_ptr with boost smart pointer

I develop a desktop chat with boost asio and beast (for browser support).

I use this architecture : enter image description here

But, when building, I have an issue : bad_weak_ptr, I don't know what is wrong :s Here a link to the source https://onlinegdb.com/BkFhDGHe4

Update1 : I remove run() function into constructor and move it into handle_accept function, tcp_server class. like this:

void tcp_server::handle_accept(const boost::system::error_code ec, websocket_session_ptr new_websocket) { if (!ec) { // Happens when the timer closes the socket if(ec == boost::asio::error::operation_aborted) return; new_websocket->run(); //Here chatwebsocketsessionpointer session = chat_websocket_session::create(room, new_websocket); room->join(session); wait_for_connection(); } } I can see the chat_webocket_session is deleted, but still have issue with bad_weak_ptr

Update 2 : I found where is the issue. If I never call do_read() function, there is no error, and I can connect to server with ws If I call it into wait_for_data from chat_websoket_session class, I have issue. So I must found how call do_read()

Update 3 : If I do websocket_session_ptr new_websocket(new websocket_session(std::move(socket))); acceptor.async_accept( socket, boost::bind( &tcp_server::websocket_accept, this, boost::asio::placeholders::error, new_websocket ));

making ref to : boost beast websocket example, I accept first the socket, and after I accept the websocket with m_ws.async_accept() but I have now Bad file descriptor which means the socket is not open.

P.S: I update the ide URL (GDB online debugger)

0 投票
0 回答
1170 浏览

c++ - C++ Boost Beast 空响应体

我正在玩 Boost 的 Beast 部分,我正在尝试创建一个简单的 http 客户端,该客户端可用于/GET来自 Web 资源的内容(简单的 HTML 或 REST 服务)。

我使用了可以在beast 的github repo中找到的示例,用于同步 http 客户端,并将其移动到一个名为http_client的简单类中:
标题:

执行:

现在的问题是给定的 string_body 是空的,尽管 http 状态码是 200。

示例调用:

通话中是否缺少某些内容?

0 投票
2 回答
2509 浏览

c++ - 通过野兽网络套接字发送二进制数据(在 C++ 中)

我想通过websocket 连接将二进制音频数据发送到 IBM watson STT 服务。我已成功建立连接,现在尝试以以下格式发送数据:

为此:我正在读取一个原始音频文件(extn .pcm),如下所示

问题 1:我不确定我是否正确读取了二进制数据。应该是数据类型binarydatastring

接下来在boost websocket上发送数据(握手后)我遵循了这个例程

该程序不显示任何输出并退出

write:start:WebSocket 流在两个端点都正常关闭

问题 2:数据是否按预期正确运行?如何检查?(预计:见此链接

websocket如何在不发送关闭命令的情况下关闭?

更新:

0 投票
1 回答
678 浏览

c++ - 野兽websocket惯用关闭?

我有我的 C++ 程序。主线程创建一个专用于仅处理 websocket 的新线程。这个新线程使用例如 boost beast 的 async_read() 调用进行读写。这很像https://www.boost.org/doc/libs/1_69_0/libs/beast/example/websocket/server/async/websocket_server_async.cpp,其中每个异步调用都会引发另一个异步调用。

但是,什么是让主线程告诉 websocket 线程关闭的惯用方法,因为可能总会有一些异步读取或写入调用未完成,例如 async_read() 空闲等待服务器最终发送数据。关闭需要执行诸如取消剩余的 async_read() 之类的操作,而不会引入某种竞争条件,即在取消之前开始读取。

0 投票
1 回答
828 浏览

boost - 如何使用 boost::beast 避免回调地狱?

我正在开发一个我想在其中使用 boost::beast/asio 的应用程序。我需要通过 websocket 连接接收数据并同时向 REST API 发出请求。

在 boost::beast websocket/HTTP 异步客户端示例中,似乎下一个异步操作是在完成处理程序中启动的。这似乎引发了我在 node.js 应用程序中看到的相同的“回调地狱”。

为了避免这种情况,我正在考虑在我的应用程序中使用一个简单的状态机来决定接下来要开始什么操作。我正在考虑在我的应用程序中有一个 while 循环,我在 io_context 上调用 poll() 之后我运行我的状态机代码(例如 switch(state) { ... state = nextState; } )

然而,这可能会创建一个繁忙的循环,其中主线程在不断运行状态机的同时消耗 100% cpu?

我的推理是否正确,使用 post() 之类的东西来排队一个可以推进状态机的函子会更好吗?

0 投票
1 回答
688 浏览

c++ - 如何在 beast::websocket 中读取错误请求的标头?

我有一个应该响应 GET 请求的 websocket 服务器(监听环回接口)。这是我的做法

但我还需要能够处理位置(如localhost:2019/some_location)。

有办法吗?

解决方法:手动读取表头,检查是否升级

0 投票
1 回答
267 浏览

http - 根据查询的路由使用不同的请求解析器

我正在使用 boost beast 实现一个迷你 http 服务器。服务器有两条不同的路由 POST /upload/ ...,另一个是 POST /info。第一个用于上传一些大文件,另一个用于处理 json 对象。为了保持尽可能高的性能,我尝试使用合适的解析器 file_body 和 string_body/dynamic_body 解析每条路由。我希望可以做类似的事情:

但这似乎不可能。

有没有办法根据标头信息使用不同的请求主体?

提前谢谢了

0 投票
2 回答
92 浏览

c++ - 调用不带回调的 boost 函数

我正在使用 boost-beast 库进行 websocket 连接。您可以参考此示例了解正在发生的事情。我使用了相同的示例,但更改了一些内容:

  • 将 theon_handshake(beast::error_code ec)分成三个函数A(beast::error_code ec)B(beast::error_code ec)并且C(beast::error_code ec)

  • B()发送二进制数据,A()C()正在发送文本。

  • A()B()作为回调调用和作为回调B()调用C()

现在我被困在我想要这样做的地方:

这是读取功能:

问题:-请在那里检查功能B()和我的问题。任何建议或答案表示赞赏。