问题标签 [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 投票
0 回答
195 浏览

c++ - 为什么 noexcept 不用于异步库(如 Asio 和 Beast)

异步函数通常不使用异常。

即使在同步调用中,Asio 和 Boost-Beast 也有重载,它们采用类型的输出参数system_error&而不是抛出。

异步操作不能抛出异常,因为操作没有在调用代码的堆栈帧中完成¹。

没有声明这些是否有技术原因noexcept

除了可能的性能优势之外,我还认为这对用户来说是有用的提示,因为用户知道他们不需要异常处理。

¹ 从技术上讲,它们可能会抛出异常,例如前置条件检查或无效参数

0 投票
2 回答
1549 浏览

c++ - Boost Beast 服务器响应延迟 1 秒

我正在尝试使用 boost::beast 创建一个 HTTP 服务器,但我注意到响应时间延迟了一秒。我使用了高级服务器示例和同步客户端示例来对这种行为进行基准测试。

还尝试禁用 Nagle 的算法,但没有效果,似乎不是优化问题。

每隔几秒钟手动发出一个请求,因此服务器端的高负载是不合理的。

它似乎与 boost::asio 套接字有关,因为我前段时间还创建了一个 HTTP 服务器(我认为使用 boost::asio - Boost v1.64,当 Beast 不在时)并且我体验到同样高的响应时间- 这就是我改用野兽的原因。

我的问题:

这是 boost::asio 套接字的已知行为吗?

这种延迟可以解决吗?

为什么在套接字上设置 no_delay 可能不起作用?

基准测试结果:

示例服务器的平均响应时间在 1005 毫秒到 1020 毫秒之间,如下面的屏幕截图所示。相比之下,同一客户端在 120 毫秒内收到来自 google.com 的响应。

是对我的本地服务器的请求与对 www.google.com 的请求之间的比较

因此,问题又来了:这 900 毫秒的延迟是从哪里来的?这不是任何 HTTP 服务器可接受的响应时间。

并且还尝试了快速示例服务器同步服务器示例,结果相同:响应时间超过 1000 毫秒。

基准设置

测试系统:

  • Windows 10 专业版 x64
  • 处理器 Intel i7-7700,16GB RAM
  • 提升 1.66
  • 视觉工作室 2015

在 x86 和 x64 中使用 Debug 和 Release 版本进行测试。正如预期的那样,唯一的区别是 Debug 构建的额外延迟为 20-30 毫秒。

服务器设置

  • 我从 Beast 文档中获取了高级服务器示例
  • 在 Visual Studio 2015 中创建了一个新的空控制台项目
  • 将示例代码添加到新的 cpp 源文件
  • 在项目的属性 > VC++ 目录 > 包含目录中设置 boost "...boost\include" 包含文件夹
  • 在项目的属性 > VC++ 目录 > 库目录中设置 boost 库文件夹
  • 在 C/C++ > 预处理器中添加了“_WIN32_WINNT=0x0601”
  • 在“调试”>“命令参数”中,我添加了“0.0.0.0 8080 . 3”,这意味着“将服务器绑定到端口为 8080 的所有本地地址,使用 .(当前目录)作为根文件夹并在 3 个线程上运行服务器”。

客户端设置

  • 我使用了 Beast 文档中的同步客户端
  • 创建了一个类似的 Visual Studio 项目

为了测量请求时间,我在客户端代码中添加了计时器,并注释掉了对 cout 的响应输出:

这是禁用 TCP 延迟的客户端代码:

这是服务器示例代码的唯一修改。以及禁用 TCP 延迟的服务器代码:

这是修改后的客户端:

0 投票
1 回答
48 浏览

c++ - 通过 boost::beast 设计不同订阅率的多个订阅

我正在尝试设计一个系统,我正在创建一个树状结构,用户可以订阅树的任何分支。例如:如果一棵树看起来像

这里 A 是 B 的父节点,B 是 C 和 D 的父节点 现在,用户在分支 ABD 上发出了 5 秒的订阅请求。
5 秒订阅请求意味着通过 GUI 或其他任何方式进行订阅的用户应该每 5 秒获得一次 A、B 和 D 节点的更新(三个节点的更新应该同时发送)。

用户在其 GUI 上实际上是在查看具有 A 的行(以及与之对应的一些指标),其中 B 的子行和 B 的子行 D 的子行,他希望同时查看三行的更新时间(一种向下钻取表)。
可能有另一个用户订阅了 ABC,并且可能以 10 秒的速率订阅了这个分支。

树的这个服务器代码是用 C++ 开发的,我正在尝试将它集成到 boost::beast 以将其连接到将通过其进行订阅的 HTTP Web 套接字。但是,我想知道 boost::beast 中是否有一个模块可以帮助我以不同的费率用例维护这些多个订阅。

0 投票
1 回答
830 浏览

c++ - 提高批量请求的野兽内存使用率

我运行了这个 boost-beast-client-async-ssl示例,没关系。但是,如果我同时创建 10000 个会话,我的程序内存使用量将增长到 400 MB,并且永远不会下降。我会在没有 ssl(简单的 http)的情况下进行测试,并且没有增长内存。

问:openssl 有什么问题?

这是我的主要功能。

编辑:ubuntu 14.04,boost 1.66,g++ 4.9.4。OpenSSL 1.0.1f 2014 年 1 月 6 日。

EDIT2:根据 这个问题malloc_trim释放(返回操作系统)大量未使用的内存。如果 boost asio 本身支持 malloc_trim 用于 unix 系统上的 ssl 连接,那将是最好的!

0 投票
3 回答
9053 浏览

c++ - 使用带有 SSL (HTTPS) 的 Boost-Beast (Asio) http 客户端

我是 SSL 和 Boost-Beast 库以及 C++ 的新手,但那是另一回事。我有一个关于在 Beast 中使用 HTTPS (SSL) 的问题。我将使用该库连接到 REST 服务并将 JSON 发布到我不控制证书、API 等的服务器。

它有点工作。问题是我不清楚它是如何工作的。在 Beast 附带的示例中,它引用了一个文件example/common/root_certificates.hpp,其中包含两个 base64 格式的证书或类似的证书。

当我尝试这个例子时,我让它使用 POST 一个 JSON 字符串到服务器,我们称之为“exampleserver.com”。连接到端口 80 和 443。即使我注释掉了它调用根证书函数的行,load_root_certificates(ctx);. 握手或其他任何错误都没有出现。服务器正确响应。

所以,我的问题是:

1) Beast 库是从那里获得证书exampleserver.com还是我已经安装了它,这就是它起作用的原因?如果是这样,当它到期时会发生什么?我是否必须在每个使用我的应用程序的客户端上重新安装一个新的?我宁愿在我的代码中没有任何硬编码的证书来检查它。证书说DigiCert Global Root CA -> DigiCert SHA2 Secure Server CA是浏览器附带的标准证书吗?

2) 它只是在端口 443 上使用纯 HTTP(无 SSL)吗?不知道这是否可能...

0 投票
1 回答
2948 浏览

c++ - C++ Boost 1.66 使用 Beast http request Parser 来解析字符串

我没有在我的项目中使用野兽 http 服务器,但我正在寻找一种解决方案来在我的程序中以 std::string 的形式解析 http 请求,是否可以在此使用 boost/beast/http/parser.hpp如果是这样的话,如果你在代码中给出一个例子,那就太好了。非常感谢

0 投票
1 回答
2335 浏览

c++ - 使用 Boost Beast 通过代理发出同步 http 请求时出现问题

我已经修改了 http_sync 示例以通过代理进行连接,我已经使用wireshark 进行了测试,问题是在我发送 http 连接请求后,代理返回代码 200 OK,而我的程序无法读取,它得到在 http::read 上等待大约 1 分钟,然后服务器断开我的连接。我尝试过解决这个问题,只是不阅读响应,但是当我尝试进行 ssl 握手时,我收到一个错误:未知协议(就wireshark 显示而言,我的 ssl 握手发送一个客户端问候,然后我收到完整的服务器你好,但我的程序同时发送了一个 FIN 并给了我错误,我认为这是因为他阅读了 200 OK 而不是服务器的答案并且感到困惑)。所以我想我的问题是,有没有办法解决这个问题?我不知道为什么 http::read 会卡住。它可以正常工作,中间没有代理。这是我的代码:

0 投票
2 回答
936 浏览

c++ - Websockets的Boost :: Beast非阻塞读取?

我们有一个完全同步的应用程序,并且将始终如此,因为它基本上是一个命令行解释器,用于向我们的硬件发送低级命令,并且您不能同时将两个命令发送到硬件。对于此配置,我只会有 1 个客户端套接字以同步方式运行,向服务器发送一个命令,它与硬件对话,并将值发送回客户端,但据我所知,目前 async_read 是唯一的方法非阻塞读取。

通过 Beast 获得非阻塞读/写的最佳方法是什么?例如,在 Windows 中的 TCP 和 Serial 中,您可以查看缓冲区以查看数据是否已准备好访问,如果存在,您可以发出读取命令,知道它不会阻塞,因为数据在那里。不确定我是否只是缺少 Beast 中的这个功能,尽管我会说如果可能的话拥有这样的功能会很好。

无论如何,基于此我有一个问题

首先,我可以以 Coroutine 为例,而不是使用 yield,来创建并传递一个 read_handler 函数吗?

我采用了协程示例,并将函数构建到我的类中,并使用了与该线程答案完全相同的 read_handler。 如何将读取处理程序传递给 Beast websocket 的 async_read?

正如他所说,它可以编译,但设置断点永远不会在收到数据时触发。

我真的不需要像异步示例那样的完整异步功能,将其推送到不同的线程中,事实上这让我的生活更加困难,因为应用程序的其余部分不是异步的。而且因为我们允许来自各种来源(键盘/TCP/串行/文件)的输入,我们不能阻止等待数据。

0 投票
1 回答
1176 浏览

c++ - 如何使用 boost::beast 检测 websockt 中的断开连接?

我知道我可以使用 , 中的错误代码async_writeasync_read检查断开连接。

但是,在我的情况下,收到东西后,我无法立即回信(或者回信可能永远不会发生)。

在读写之间,如何查看客户端断线异常?

0 投票
0 回答
308 浏览

c++ - Boost.Beast C4702 在 MSVC++ 构建时出现“无法访问”编译器警告

在 Windows 上使用 Boost-1.67.0 和 VS 构建时,我在以下位置收到 C4702“无法访问”警告boost::beast::http::detail::verb_to_string(verb v)boost/beast/http/impl/verb.ipp

添加最后一个(底部)return "<unknown>";是为了安抚那些不够聪明的编译器,他们不知道抛出的异常会阻止正常返回;但是,同一行代码对于(更智能的)Visual Studio 来说是有问题的,它将语句标记为不可访问(C4702)。在我的例子中,我们将编译器警告翻译成错误,所以这不仅仅是烦人的。

以下黑客从@DanielSeither 对Disable single warning error的回答中获得了一些灵感,并且似乎有效:

但是没有修补 Microsoft VC++ 构建的源代码,有人可以提出更好的解决方法吗?