问题标签 [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 回答
543 浏览

angular - Angular5 + SocketIO 来提升::Beast

所以我使用这里的教程来使用 Angular 5.x 设置我的 socket.io 连接

https://blog.codewithdan.com/2017/11/07/pushing-real-time-data-to-an-angular-service-using-web-sockets/

有两种情况发生,我不确定为什么一种有效,一种无效,所以我希望有人能提供帮助。

失败的场景

1) 使用服务器 IP 10.1.1.1 上的 Boost::Beast CPP 库启动我的 WS 服务器,使用 chrome 插件“Simple WebSocket Client”我连接到我的服务器 IP 地址,它通过 Beast 的 HTTP 处理程序连接,将其视为Websocket 升级请求,并产生我的 websocket 会话并按预期工作和连接。我正在修改我的 HTTP 请求以设置 ALLOW-ACCESS-CONTROL-ORIGIN 和其他标志来处理阻止我的 Angular 客户端的 CORS 问题,目前我只是强制它允许http://localhost:4200,尽管我计划将其更改为只是回显客户端的 IP,不确定这是否是我诚实遇到的问题的一部分。

万一这很重要,这是我添加的请求项目

这是失败案例的响应/请求/一​​般

https://imgur.com/a/ZqyC1iz

工作场景

1) 使用服务器上的 Boost::Beast CPP 库启动我的 WS 服务器。将 Socket.Io 用于 Angular5。它基本上是一个空白的 angular-cli 项目,在我做的应用程序组件中

尽管在查看了人们试图强制 SocketIO 直接进入 websocket 模式而不进行其他 http 事务的其他一些问题后,我也尝试了以下方法。

结果与工作案例不同,请求似乎相同,但它从未触发我在 Beast 中的 websocket 升级请求代码,据我所知,连接从未建立。

这是失败案例的请求/响应/常规 https://imgur.com/a/qiTfFAo

我再次觉得这与Chrome插件直接连接到服务器的IP地址这一事实有关,当我通过我的角度项目连接时,它发送Localhost:4200作为源,而不是客户端机器实际IP地址?

任何帮助将不胜感激。

0 投票
1 回答
1079 浏览

http - 如何使用 boost::http::response_parser 解析字符串?

我想使用 boost::http 的 response_parser 解析我自己的数据。我找到的所有文档都与 http::request of boost 相关联。我已经编写了自己的 SSLLink 来获取数据。我想将数据增量地提供给 response_parser 并检查是否已解析完整的消息。

我发现这个答案有些相关: Parse Response。但它不提供增量提供数据的方法。

0 投票
3 回答
1997 浏览

c++ - 如何在组合函数中使用 boost::asio::defer()?

在 Boost 1.66 上,Asio 已经弃用asio_handler_is_continuationhook 函数,促进了defer函数的使用。似乎该 函数的行为与asio_handler_is_continuation==true 时defer的行为完全相同。post但是,使用方式与使用defer方式不同asio_handler_is_continuation,我不知道如何正确使用defer

编辑:我认为下面的示例过于冗长,无法清楚地表达我的意思。这是较短的示例:

现在async_read_until完成后,传递的 lambda 处理程序将使用与boost::asio::post. 但是async_write在 lambda 处理程序内部是上一个异步任务的延续,所以我想调用 lambda 处理程序来利用defer优化。

在上面的示例中,有什么方法可以使用defer(而不是post)调用 lambda 处理程序?

原始帖子:我正在尝试编写一个async_echo类似于野兽文档中的简单启动函数,除了调用的部分boost::asio::async_write将被称为延续。为了实现这一点,之前boost::asio::async_read_until的中间操作必须调用处理程序*this作为延续。

这是我在野兽文档的 async_echo 示例中所指的部分:

在 1.66 之前的日子里,我可以简单地挂钩函数,如下所示:

echo_op.

从 Boost 1.66 开始,上面的代码不太可能有任何效果(没有BOOST_ASIO_NO_DEPRECATION宏)。所以我应该使用defer.

但是由于boost::asio::async_read_until保证处理程序的调用将以等效于使用 boost::asio::io_context::post(). 的方式执行”,*this因此不会使用 调用defer,即作为延续。

是否有任何解决方法可以boost::asio::async_read_until使用调用处理程序defer?有没有利用defer函数的好例子?

0 投票
1 回答
60 浏览

c++ - 无法识别 HTTP 标头字段

我正在尝试使用 boost::beast 来通过 HTTP 与服务器通信。

我在客户端工作,想发送一个至少包含以下标题字段的请求:“X-API-SIGNATURE”。

我正在按如下方式创建请求:

我发送请求如下:

之后,我得到来自服务器的响应,报告我一个错误:

我不明白为什么服务器无法识别我之前插入请求中的“X-API-SIGNATURE”标头字段。

我做错了什么?

0 投票
1 回答
1021 浏览

c++ - 带有野兽增强的 OAuth2 返回临时重定向 307

我正在尝试使用oauth2 身份验证在beast boost C++ 中实现一个可以访问谷歌驱动器的应用程序。

https://developers.google.com/identity/protocols/OAuth2ForDevices

我尝试使用以下 POST 请求在 Postman 中获取用户代码:

它工作得很好,返回:

}

现在我想在 C++ 中使用 boost 执行相同的请求,请求的代码片段如下:

这个返回:

有什么想法可以像使用 Postman 一样返回 JSON 吗?

谢谢你!

0 投票
1 回答
3573 浏览

c++ - 使用 body_limit 提升野兽消息

我的出发点是从 boost http_client_async 的 boost beast http_client_async 示例创建一个简单的下载器代码。在这种情况下,我想将接收到的正文写入文件。

于是我把字符串body换成了file_body,来写接收到的数据:

并简单地将 on_write 方法重写为

所以但是现在,一些接收到的数据体太大了:

我试着增加身体极限。

如果使用解析器而不是消息,则可以使用该body_limit()方法更改请求正文的大小限制。

是否也有一种简单的方法可以从消息中增加正文大小限制?

0 投票
2 回答
553 浏览

c++ - Boost Beast编译错误

d:\boost\boost\beast\core\detail\ostream.hpp(263): error C2955: 'boost::beast::detail::ostream_helper': 使用类模板需要模板参数列表

编译示例项目时:http_server_small.cpp(来自“beast”)

提升\野兽\核心\细节\ostream.hpp:

Boost 版本 1.67.00,在 Visual Studio v171 (2017)、x64 下编译

它看起来像是 boost/beast lib 中的错误,但在 lib 的发布版本中看到编译错误很奇怪。(我不是lib的作者,我只是想使用它)。

也许我缺少一些编译选项或标志?有没有人弄清楚问题是什么以及如何解决?

0 投票
1 回答
6571 浏览

c++11 - 增强野兽 HTTP

我正在开发一个 http 解析器,看起来 boost.beast 是一个不错的解析器。但是,我仍然有一些问题:

*** 假设已经通过 boost.asio 套接字接收到 HTTP 请求 POST 数据。存储在 std::string 缓冲区中。

  1. 有没有关于如何提取 http 标头字段及其值(一个接一个)的好示例?我认为这将是一个迭代器方法,但我尝试了几种方法,但仍然无法正常工作。

  2. 如何提取http正文?

非常感谢。

0 投票
1 回答
368 浏览

c++ - Cmake 忽略了我所有关于在 boost::beast 存储库中找到提升的指令

我正在使用 Ubuntu 16.04(带有 boost 1.58),我必须使用boost::beast. 所以我得到了最新版本的 boost (1.67),现在我正在尝试编译beast 存储库以使用示例。

我以最简单的方式编译了 boost。./bootstrap然后我做了./bjam,它编译得很好(我使用了它)。

我需要什么:我需要 cmake 来识别我希望它找到 1.67 版本,而不是系统中的版本 ( /usr/bin)。

为什么我不能从我的系统中删除 boost 的存储库版本?因为它将删除我系统中的许多其他依赖项,并且我开发了其他使用 Ubuntu 16.04 作为基线的东西。

我尝试了什么:

CMakeLists.txt从存储库获得的文件中,我根据文档添加了这些行(在所有内容之前和项目名称之后):

当我尝试编译野兽(以便它也编译示例)时,我收到错误:

我什至从我的系统中卸载了 cmake 并自己编译了一个,Cmake 3.11.2。

我还可以做些什么?请指教。


编辑:以下是按照Boost_DEBUG评论中的建议启用后 cmake 的输出:

0 投票
1 回答
321 浏览

networking - websocket能保证单条消息的完整性吗?我应该为 websocket 消息实现自己的标头吗?

我正在用 C++(使用 boost-beast)为 Web 应用程序编写后端,而前端可能会使用 socket.io。所以这个问题既适用于实现,也适用于 websocket 标准中是否有一些东西可以回答我的问题。

我不确定要采取哪些预防措施来保证消息的完整性。假设客户端发送一条 100 字节长的消息,boost::beast 将消息读取async_readmulti_buffer. 我能保证收到全部 100 个字节吗?大概。但是如果消息是 1 MB 怎么办?

为什么我认为这个问题很重要?因为这决定了我的通信协议有多简单。如果只发送和接收完整的消息,那么我不必实现带有决定消息大小的标头的中间件协议(这通常对于 TCP 是必需的,但在某些消息传递库中不是必需的像 ZeroMQ)。但是,如果不能保证消息在到达时是完整的,那么我应该实现一个协议来获取消息大小。类似(最简单的):6 个字节,包含消息大小 + 消息。然后我将其作为 FIFO 队列读取以处理消息的大小,然后读取消息。

我以错误的方式接近 websocket 吗?请指教。