问题标签 [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.
angular - Angular5 + SocketIO 来提升::Beast
所以我使用这里的教程来使用 Angular 5.x 设置我的 socket.io 连接
有两种情况发生,我不确定为什么一种有效,一种无效,所以我希望有人能提供帮助。
失败的场景
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,不确定这是否是我诚实遇到的问题的一部分。
万一这很重要,这是我添加的请求项目
这是失败案例的响应/请求/一般
工作场景
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地址?
任何帮助将不胜感激。
http - 如何使用 boost::http::response_parser 解析字符串?
我想使用 boost::http 的 response_parser 解析我自己的数据。我找到的所有文档都与 http::request of boost 相关联。我已经编写了自己的 SSLLink 来获取数据。我想将数据增量地提供给 response_parser 并检查是否已解析完整的消息。
我发现这个答案有些相关: Parse Response。但它不提供增量提供数据的方法。
c++ - 如何在组合函数中使用 boost::asio::defer()?
在 Boost 1.66 上,Asio 已经弃用了asio_handler_is_continuation
hook 函数,促进了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
函数的好例子?
c++ - 无法识别 HTTP 标头字段
我正在尝试使用 boost::beast 来通过 HTTP 与服务器通信。
我在客户端工作,想发送一个至少包含以下标题字段的请求:“X-API-SIGNATURE”。
我正在按如下方式创建请求:
我发送请求如下:
之后,我得到来自服务器的响应,报告我一个错误:
我不明白为什么服务器无法识别我之前插入请求中的“X-API-SIGNATURE”标头字段。
我做错了什么?
c++ - 带有野兽增强的 OAuth2 返回临时重定向 307
我正在尝试使用oauth2 身份验证在beast boost C++ 中实现一个可以访问谷歌驱动器的应用程序。
https://developers.google.com/identity/protocols/OAuth2ForDevices
我尝试使用以下 POST 请求在 Postman 中获取用户代码:
它工作得很好,返回:
}
现在我想在 C++ 中使用 boost 执行相同的请求,请求的代码片段如下:
这个返回:
有什么想法可以像使用 Postman 一样返回 JSON 吗?
谢谢你!
c++ - 使用 body_limit 提升野兽消息
我的出发点是从 boost http_client_async 的 boost beast http_client_async 示例创建一个简单的下载器代码。在这种情况下,我想将接收到的正文写入文件。
于是我把字符串body换成了file_body,来写接收到的数据:
并简单地将 on_write 方法重写为
所以但是现在,一些接收到的数据体太大了:
我试着增加身体极限。
如果使用解析器而不是消息,则可以使用该body_limit()
方法更改请求正文的大小限制。
是否也有一种简单的方法可以从消息中增加正文大小限制?
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的作者,我只是想使用它)。
也许我缺少一些编译选项或标志?有没有人弄清楚问题是什么以及如何解决?
c++11 - 增强野兽 HTTP
我正在开发一个 http 解析器,看起来 boost.beast 是一个不错的解析器。但是,我仍然有一些问题:
*** 假设已经通过 boost.asio 套接字接收到 HTTP 请求 POST 数据。存储在 std::string 缓冲区中。
有没有关于如何提取 http 标头字段及其值(一个接一个)的好示例?我认为这将是一个迭代器方法,但我尝试了几种方法,但仍然无法正常工作。
如何提取http正文?
非常感谢。
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 的输出:
networking - websocket能保证单条消息的完整性吗?我应该为 websocket 消息实现自己的标头吗?
我正在用 C++(使用 boost-beast)为 Web 应用程序编写后端,而前端可能会使用 socket.io。所以这个问题既适用于实现,也适用于 websocket 标准中是否有一些东西可以回答我的问题。
我不确定要采取哪些预防措施来保证消息的完整性。假设客户端发送一条 100 字节长的消息,boost::beast 将消息读取async_read
到multi_buffer
. 我能保证收到全部 100 个字节吗?大概。但是如果消息是 1 MB 怎么办?
为什么我认为这个问题很重要?因为这决定了我的通信协议有多简单。如果只发送和接收完整的消息,那么我不必实现带有决定消息大小的标头的中间件协议(这通常对于 TCP 是必需的,但在某些消息传递库中不是必需的像 ZeroMQ)。但是,如果不能保证消息在到达时是完整的,那么我应该实现一个协议来获取消息大小。类似(最简单的):6 个字节,包含消息大小 + 消息。然后我将其作为 FIFO 队列读取以处理消息的大小,然后读取消息。
我以错误的方式接近 websocket 吗?请指教。