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

c++ - 为什么这个 C++ ASIO, BEAST 服务器在执行 HTTPS/SSL 请求时会进入错误状态

我想编写一个响应 HTTP 请求的服务器。我不关心HTTPS。如果有人执行 HTTPS 请求,我想拒绝该请求并继续其他 HTTP 请求。我的代码如下所示:

我使用 Firefox 运行代码并按以下顺序请求执行:

  1. 一个http请求
  2. https 请求
  3. 一个http请求

我期望以下服务器输出:

但是,我得到的是:

抛出的函数是boost::beast::http::read. 但是,我不明白为什么。在调用之间我创建了一个新的套接字对象,因此我的理解是第二个请求的结果不应该影响第三个。但是,显然我的理解是不正确的。有人可以解释一下我对 ASIO 和/或 BEAST 如何工作的理解是错误的。谢谢 :)

0 投票
1 回答
769 浏览

c++ - 野兽 async_read() 是如何工作的?有什么选择吗?

我对boost::asio基础知识不是很熟悉。我正在处理一项已连接到 Web 服务器并读取响应的任务。响应是在随机周期内抛出的,生成响应时。

为此,我正在使用包含基础知识的boost::beastboost::asio

我发现该async_read()函数正在等待,直到它收到响应。

现在,事情是:在文档和示例中,websocket 通信的异步方式显示在 websocket 在收到响应后关闭的位置。

这是通过此代码(野兽文档)完成的:

在这个程序中,假设发送在接收之前完成。并且只有一次响应来自服务器的期望。之后,它(客户端)继续前进并关闭 websocket。

在我的程序中

我必须检查写作部分是否已经结束,如果没有,在写作过程中,websocket 应该来检查到目前为止所写内容的响应。

现在为此,我放了一个 if else 来告诉我的程序我的写作是否完成?如果没有,那么程序应该回到写入部分并编写所需的东西。如果是,然后关闭连接。

现在我要做的是写入完成后等待3秒,每1秒读取一次websocket,3秒后关闭websocket。

为此,我又添加了一个 if else 来检查 3 秒条件read_resp

但是 websocket 正在等待async-read接收某些东西,这样做只会进入会话超时。

如何只查看是否有要读取的内容,然后继续执行回调?

0 投票
1 回答
567 浏览

c++ - 使用 lambdas 和 Boost Beast 而不是 bind

这个例子中,如果我用 bind 改变这个调用:

对此:

我收到一个断言错误:

那里有一条评论:

我个人不喜欢 bind,想把它改成 lambda。我做错了吗,或者这是 boost::beast 中的一个小错误?

顺便说一句,更改为 lambda foron_resolve工作正常。

0 投票
1 回答
728 浏览

c++ - 从 http 流(在 boost::beast 中)读取和写入的要求是什么?

我想使用 boost::beast 来读写 etcd。首先,我希望能够用 boost beast来做这些例子。它们很容易用 curl 完成。Etcd 可以看作是一个键/值存储。设置/获取(示例页面中的放置/范围)的功能很容易使用boost::beast 客户端示例。那里没有问题。

但是“看”,我不明白。根据docs, watch 是一个连续的流,与其他会话不同,后者是在检索结果后立即终止的会话。curl 示例显示了在手表仍处于活动状态时更改值和现场响应。我应该使用相同的流来执行与该手表相关的所有事情,包括停止它。

我的问题大致是:如何在 boost::beast 中实现这一点

假设从客户端示例中我通过一个线程提交ioc.run

现在我可以完全控制主线程中的客户端。我应该创建新的 http 请求并async_write通过套接字对象提交它们吗?但是如果我这样做,我会失去 boost::beast 用 nice 包装 http 标头的功能http::request<http::string_body>。我应该手动创建标题吗?还是我应该只发送json某种行终止符来指示消息已结束?通信协议是什么样的?

boost::beast 的一个例子会很棒。

0 投票
1 回答
969 浏览

c++ - 如何将 boost::beast 中的序列化数据转换为字符串,以便以 FIFO 方式处理它?

我有一个客户端应用程序,我需要从服务器接收 http“长时间运行的请求”。我发送一个命令,在获得响应的标头后,我必须接收分隔的 json 数据,\r\n直到连接终止。

我设法调整boost beast 客户端示例来发送消息并接收标头并解析它并接收来自服务器的响应。但是,我未能找到一种方法来序列化数据以便处理 json 消息。

可以在这个继电器示例中找到最接近该问题的演示。在那个例子中(p是解析器,sr是序列化器,input是套接字输入流,output是套接字输出流),在读取 http 标头后,我们有一个从服务器连续读取的循环:

这里有一些我不明白的事情:

  1. 我们已经读完了标题。为什么我们需要 boost beast 而不是 boost asio 来读取原始 tcp 消息?当我尝试这样做时(同时使用 async_read/async_read_some),我得到了一个零大小的无限读取。
  2. 解析器的文档说(在页面末尾)每条消息都需要一个新实例,但我在示例中没有看到。
  3. 由于 tcp 消息读取不起作用,有没有办法将解析器/序列化器数据转换为某种字符串?甚至以先进先出的方式将其写入文本文件,以便我可以使用一些 json 库来处理它?我不想像示例那样使用另一个套接字。

该函数boost::beast::buffers()无法为解析器和序列化程序编译,并且解析器没有消费函数,序列化程序的消费似乎是针对消息的特定 http 部分,如果我为body().

除此之外,我还未能从解析器和缓冲区中获取一致的数据块 old-school std::copy。我似乎不明白如何将数据组合在一起以获得数据流。在接收数据的任何时候使用缓冲区.consume()都会导致need buffer错误。

我真的很感谢有人解释所有这些应该如何协同工作的逻辑。

0 投票
1 回答
823 浏览

c++ - 是否可以处理带有超时的阻塞读取功能?

我正在开发用于客户端和服务器之间异步通信的boost websockets 。

现在我正在打印程序期间经过的时间boost::timer::auto_cpu_timer。它以秒为单位显示经过的时间。

我的程序片段如下:

此函数数据发送到 websocket:

此函数读取websocket 响应

此函数关闭Web 套接字

这是我的程序输出的样子: 从 websocket 收到的响应显示为灰色(输出cout << beast::buffers(ReadBuffer_.data());)其余是打印在程序中各个位置的 couts。经过的时间以秒为单位

读取 WS 之前经过的IBM 授权
时间:0
读取 WS 之后经过的时间:0.3

前进前经过的时间:0.3
转到 ReadSocket
阅读 WS 前经过的
时间:0.3 阅读 WS 后经过的时间:2.1

前进前经过的时间:2.1
转到 ReadSocket
阅读 WS 前经过的
时间:2.1 阅读 WS 后经过的时间:2.1

前进前经过的时间:2.1
转到 ReadSocket
阅读 WS 前经过的时间:2.1

事件推送:FILE_WRITE_DONE

阅读 WS 后经过的时间:34

前进前经过的时间:34

//程序退出 -1

问题:

几秒钟后2.1,程序再次进入 ReadSocket,在该处ws_.read(ReadBuffer_);阻塞执行近 32 秒,直到它从套接字接收到某些东西,在这种情况下,它接收到“会话超时”。

当这个块打开 5 秒时,我怎样才能移动到 CloseSocket。也就是说,如果在任何时候我ws_.read阻止我的代码超过 5 秒,我想把我的行为说出来,比如 CloseSocket。

0 投票
2 回答
545 浏览

c++ - 在野兽 1.70.0 中使用 Tcp 超时

我刚刚更新了 boost 库,1.68.01.70.0获取(beast) websocket ssl client async example中的超时操作。

在上面的链接中,您将看到:

有不止一个函数使用这种结构来处理超时。对于我的代码(在 eclipse-cdt 中,我看到它是这样的

截图

错误说(当鼠标指针悬停在expires_afterasync_connect上):


无法解析方法“expires_after”或无法解析
方法“async_connect”

当鼠标指针被接管“get_lowest_layer”时,错误说

无效参数'
候选者是:
boost::beast::detail::lowest_layer_type_impl<#0,bool74 0 value 43 8 2 201 2
boost::beast::detail::has_next_layer_impl
boost::beast::detail::has_next_layer_impl 1 # 0 0 71 4417 0 0>::type & get_lowest_layer(#0 &) '

我想知道我需要为此链接一些库。我不知道是哪一个。 有什么建议么?

0 投票
1 回答
4461 浏览

c++ - Boost-beast websocket 握手问题

我正在尝试与远程服务器建立 websocket 连接并收到以下错误:WebSocket 握手被远程对等方拒绝

我正在关注这个例子:https ://www.boost.org/doc/libs/1_70_0/libs/beast/example/websocket/client/sync/websocket_client_sync.cpp

对于以下服务器:https ://api.hitbtc.com/#socket-api-reference

提前感谢您的帮助!

0 投票
0 回答
73 浏览

boost - 从 boost 网站运行示例时出错

我在stackoverflow的几个讨论的帮助下,根据boost手册从源代码安装了它:
1. apt-get Essentials for boost
2../bootstrap
3../b2

仍然会出现错误,有人可以从经验中得知操作系统示例的工作原理。我尝试为 mac 安装 boost,但出现链接错误... 1.70 boost 不是必需的,也许是以前的版本,我只是想在我的项目中尝试野兽(它是在 1.66 中引入的)。

我正在尝试从野兽构建示例: https ://www.boost.org/doc/libs/1_70_0/libs/beast/example/advanced/server/advanced_server.cpp

生成文件:

终端:

我从源版本 1.7 安装了 boost... 我试图搜索这个错误但没有任何结果。

答:
只需从 git repos 中获取最新示例。它帮助了我,祝你好运!

0 投票
0 回答
37 浏览

boost - 编译 openssl 项目示例时出错

我正在尝试从 boost-beast git 示例构建示例advanced-flex 。我从源安装了 boost 和 openssl,所以post对我没有帮助。我对构建项目有基本的了解,我的尝试是(-I... 修复 openssl 致命错误:openssl/conf.h:没有这样的文件或目录):

我得到大量错误列表,其结尾为:

这导致我从我之前引用的stackoverflow发布,然后我尝试过:

文件夹 usr/local/ssl/lib 内容: