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

php - 将一些数据从 PHP 流式传输到 C++

我的目标是从 C++ 应用程序向 PHP 发送一个简单的 GET 查询,例如“do re mi fa sol”并获取一些我可以播放的数据。

PHP 脚本将返回我将在 C++ 客户端中解释的字节流。我读取一个字节以了解下一段(文本或 WAV 音频文件)的性质。我读取了 2 个字节作为下一段的大小。我读取了段数据并进行了相应的处理。

我不是 C++ 和 PHP 方面的专家,但我使用 boost 库进行了管理。只要我发送的数据很小,它就可以正常工作。如果数据达到一定的大小,它就搞砸了:我得到了一个无效字节,因为该段的性质(我读取的第一个字节)。

我认为它搞砸的限制是8192Bytes,我猜它只是在缓冲区的开头写回?

我尝试了一些事情: - 更改我读取套接字的缓冲区的大小。- 让我的 PHP 脚本休眠,但 C++ 客户端接缝等待请求结束,所以在我得到同样的错误之前我只是有一个延迟。- 尝试在我的 PHP 脚本中刷新,然后 ob-flush ......它并没有更好的工作,并且它接缝这些方法以某种方式向输出添加一些字节。

这是我的代码:C++

PHP:

在这一点上,我被困住了。欢迎任何帮助。谢谢。

更新 1

更改为另一种方法后,按照 elarmando 示例,我在客户端上有以下代码:

我有完全相同的结果。

但是后来我意识到了一些事情,那就是当内容大于某个值时(在我的情况下,它接缝大约是 8000,我猜是 8192),响应的标题从:

至:

所以我猜分块编码需要额外的解析。

0 投票
1 回答
1797 浏览

c++ - Boost::beast:多个 async_write 调用正在触发一个断言错误

我正在为我的全双工服务器编写测试,当我执行多个(顺序)调用(虽然被一条链覆盖)时,我从文件中async_write得到以下断言错误boost::beastboost/beast/websocket/detail/stream_base.hpp

要在您的机器上重现该问题:可在此处找到重现此问题 (MCVE) 的完整客户端代码。它在链接中不起作用,因为您需要一个服务器(在您自己的机器上,抱歉,因为无法方便地在线执行此操作,这更好地客观地表明问题出在客户端,而不是服务器,如果我把它包括在这里)。我使用websocketd./websocketd --ssl --sslkey /path/to/server.key --sslcert /path/to/server.crt --port=8085 ./prog.py使用命令where创建服务器./prog.py一个简单的 python 程序,用于打印和刷新(我从websocketd 主页获得)。

在客户端进行写入的调用如下所示:

请注意,我在示例中仅使用了 1 个客户端。客户端数组只是在测试时对服务器施加更多压力的概括。

我对这个问题的评论:

  1. 循环是顺序的;这不像我在多个线程中这样做
  2. 应该可以以全双工形式进行通信,其中无限数量的消息被发送到服务器。全双工通讯还能怎么做?
  3. 我正在使用 strands 来包装我的异步调用,以防止通过 io_service/io_context 在套接字中发生任何冲突
  4. 使用调试器对此进行调查显示循环的第二次迭代始终失败,这意味着我在做一些根本错误的事情,但我不知道它是什么。换句话说:这显然是一个确定性问题。

我在这里做错了什么?如何向我的 websocket 服务器写入不定数量的消息?


编辑:

Sehe,我想首先为代码混乱道歉(没有意识到这很糟糕),并感谢您为此付出的努力。我希望你问我为什么它同时以这种(可能)有组织且混乱的方式构建,答案很简单:主要是一个 gtest 代码,用于查看我用来强调的通用、多功能 websocket 客户端是否工作-测试我的服务器(它使用大量多线程 io_service 对象,我认为这些对象很敏感,需要进行广泛的测试)。我计划在实际生产测试期间同时用许多客户端轰炸我的服务器。我发布这个问题是因为我不理解客户的行为。我在这个文件中所做的是创建一个 MCVE(人们一直要求 SO)。我花了两个小时剥离我的代码来创建它,

那么为什么我不捕捉异常呢?因为 gtest 会捕获它们并认为测试失败。主要不是生产代码,而是客户端。我从你提到的东西中学到了很多,我不得不说扔和接是愚蠢的,但我不知道 std::make_exception_ptr(),所以我找到了我的 (dumm) 方法来实现相同的结果:- )。为什么有太多无用的功能:在这个测试/示例中它们在这里没用,但通常我可以稍后将它们用于其他事情,因为这个客户端不仅适用于这种情况。

现在回到问题:我不明白的是,为什么我们必须在async_writestrand_ 在主线程的循环中顺序使用它时覆盖它(我错误地表达了我只覆盖了处理程序)。我会理解为什么要覆盖处理程序,因为套接字不是线程安全的,并且多线程io_service会在那里产生竞争。我们也知道它io_service::post本身是线程安全的(这就是我认为不需要包装 async_write 的原因)。你能解释一下在我们需要包装 async_write 本身时,什么不是线程安全的吗?我知道你已经知道这一点,但同样的断言仍在触发。我们对处理程序和异步队列进行了顺序化,客户端仍然不喜欢进行多次写入调用。还能缺少什么?

(顺便说一句,如果你写,然后得到未来,然后读,然后再写,它会起作用。这就是为什么我使用期货来准确定义测试用例并定义我的测试的时间顺序。我很偏执这里。)

0 投票
1 回答
128 浏览

httpclient - 使用 boost::beast 解码 Ntrip 1.0 协议的最佳方法是什么

我目前正在使用boost::beast实现一个 ntrip 1.0 客户端。它的请求如下:

GET /BUCU1 HTTP/1.0 用户代理:NTRIP GNSSInternetRadio/1.2.0 授权:基本 aHVnb2JlbjpodWdvYmVuMTIz

响应如下:

冰冷 200 OK

它具有非标准的 http 响应。

我作为野兽 http 客户端示例代码,它在缓冲区中得到这个响应。但它会在读取函数中产生异常。错误是“读取,错误版本”。我想知道处理非标准 http 响应的最佳方法是什么。

0 投票
1 回答
310 浏览

c++ - bad_weak_ptr 使用继承自 boost::asio::io_context::service 的类

我开始练习使用 boost asio 和 boost beast 来开发我自己的基本服务器和连接类。最近我遇到了 bad_weak_ptr 异常,我不知道如何管理这个问题。这是代码:

还有代码停止运行的地方:

如果客户端尝试连接 server::handle_accept 中的值 shared_from_this 等于 _Wptr = empty。我认为我在理解 io_context::service 和/或 shared_from_this 功能时遇到了一些麻烦。任何帮助,将不胜感激。

0 投票
1 回答
370 浏览

boost-beast - 关于 boost beast websocket api : async_close, async_write

我已经阅读了官方文档。我对文档本身冲突感到困惑。以下是从官方挑选的文件:

但是,此代码格式正确:

ws.async_read(b, [](error_code, std::size_t){});

ws.async_write(b.data(), [](error_code, std::size_t){});

ws.async_ping({}, {});

ws.async_close({}, {});

这是另一个片段:

此操作通过对下一层的 async_write_some 函数的一次或多次调用来实现,称为组合操作。程序必须确保流不执行其他写入操作(例如 websocket::stream::async_write、websocket::stream::async_write_some 或 websocket::stream::async_close)。

那么,我应该相信哪一个呢?

0 投票
1 回答
666 浏览

c++ - boost beast WebSocket升级握手失败

使用 boost::beast 的示例代码(https://www.boost.org/doc/libs/1_66_0/libs/beast/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp),我得到:

错误:WebSocket 升级握手失败

为了确保服务器正常,我使用https://www.websocket.org/echo.html创建了一个测试,它的服务器响应很好。网址是 wss://api.fcoin.com/v2/ws,我的设置:

有人可以帮忙吗?

0 投票
1 回答
1869 浏览

ubuntu - 如何从 CMake 访问 Beast on Boost 1.66 和 1.67

我正在尝试使用 Beast 制作一个 CMake 项目,并且它已从源代码正确安装/usr/local/include/boost,但我无法让 CMake 找到它。我虽然它可能是一个3.10.2,所以我累了3.11.43.12.0-rc1但都没有工作。有谁知道该怎么做?

环境:Windows CLion 2018.1.5 和 WSL 上的 Ubuntu 18.04LTS。

尝试运行 CMake 时,出现以下错误:

0 投票
1 回答
1388 浏览

c++ - 关闭后Boost Beast重新连接websocket连接

我正在使用 boost::beast 创建一个 websocket 连接,到目前为止它似乎工作正常。但是我无法确定是否应该在断开连接后替换 websocket::stream 变量。

即我有一个变量:

启动并完成异步断开连接后:

如果我想重新启动,我应该更换 _ws 变量

0 投票
0 回答
263 浏览

c++ - boost::beast ws_.async_handshake 在同步函数工作时中断

我已经构建了一个通过 boost::beast 连接到 bitmex 的应用程序。使用以下提供的代码,同步调用可以正常工作:

https://www.boost.org/doc/libs/develop/libs/beast/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp

但是,在以下位置异步执行相同操作的代码: https ://www.boost.org/doc/libs/master/libs/beast/example/websocket/client/async-ssl/websocket_client_async_ssl.cpp

在执行 websocket 握手时总是会中断(核心):

/realtime 是数据应该来自服务器端的目标。

0 投票
1 回答
1121 浏览

c++ - 也接受 http 连接的 boost-beast websocket 服务器

我需要使用可以接受 websocket标准 http 连接的简单异步websocket 服务器来实现。boost beast

我试过这样的事情:

但是当 HTTP 客户端连接时,服务器会错过发送的第一条消息。显然,这不是正确的方法:-)

谁能帮我这个?谢谢