问题标签 [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.
c++ - 为什么 Boost Variant 使用模板构造函数而不是 boost::beast::websocket::stream 的移动构造函数?
我正在尝试将boost::beast::websocket::stream<T>
(针对 2 个特定T
的)包装在 aboost::variant
中,以允许将 TLS ( [T = boost::asio::ssl::stream<boost::asio::ip::tcp::socket>]
) 和非 TLS ( [T = boost::asio::ip::tcp::socket]
) websocket 视为相同。我陷入了编译失败。
我能想到的最简单的失败示例是:
无法编译并出现错误:
我会提供godbolt,但是它会超时,而coliru 不提供.openssl 所需的openssl boost/asio/ssl.hpp
。
Per hereboost::variant
应该接受并T &&
使用它在T
内部实例化。
Per here确实boost::beast::websocket::stream
有一个移动构造函数。
移动构造函数更具体,那么为什么编译器会选择stream<...>
第一个注释中所示的可变参数构造函数()?
我正在使用 Boost 1.66.0 和 Clang 7。
c++ - 断开连接后重新连接 boost beast (asio) websocket 和 http 连接时出错
我正在创建一个客户端应用程序,它使用 ssl Websocket 连接和 ssl Http (Keep-Alive) 连接连接到服务器,并且我正在使用boost::beast
包来做同样的事情。为了检测死连接,我实现了一个简单的乒乓机制。这些都可以正常工作,但是在处理乒乓故障时会出现问题。问题如下:
为了测试我的代码,我连接到远程服务器,发送了几条消息,然后关闭了我的 wifi。正如预期的那样,在一段时间后它检测到它没有收到来自服务器的任何消息,并尝试async_shutdown
为 http 连接和async_close
websocket 连接做一个。我注意到的第一件事是,这两个调用都阻塞了它们各自的线程,直到 wifi 恢复。
在 wifi 启动后,应用程序会在重新连接之前尝试重置流:
并为 websocket 重置 ws 变量:
不幸的是,它在 on_connect 或 on_ssl_handshake 中都失败了。以下是我的日志:
156 AsioConnectionBase.cpp:53 (2018-08-06 15:34:38.458536) [0x00007ffff601e700]:开始连接序列。连接名称:HttpKeepAliveConn
157 AsioConnectionBase.cpp:122 (2018-08-06 15:34:38.459802) [0x00007ffff481b700]:无法建立到目的地的连接。连接失败。连接名称:HttpKeepAliveConn。主持人:xxxxxxxxx。端口:443。错误:操作已取消
158 APIManager.cpp:175 (2018-08-06 15:34:38.459886) [0x00007ffff481b700]:收到来自连接的错误回调。一秒重启连接。连接名称:HttpKeepAliveConn
159 AsioConnectionBase.cpp:53 (2018-08-06 15:34:39.460009) [0x00007ffff481b700]:开始连接序列。连接名称:HttpKeepAliveConn
160 HttpKeepAliveConnection.cpp:32 (2018-08-06 15:34:39.460515) [0x00007ffff481b700]:ssl 握手失败。连接失败。连接名称:HttpKeepAliveConn。主持人:xxxxxxxxx。端口:443。错误:错误的文件描述符
161 APIManager.cpp:175 (2018-08-06 15:34:39.460674) [0x00007ffff481b700]:收到来自连接的错误回调。一秒重启连接。连接名称:HttpKeepAliveConn
所以我有两个问题:
- 如果互联网关闭并且无法正确关闭 tcp,我们如何关闭连接。
- 在重新连接之前需要重置的变量
boost::beast
(或建立在 asio 之上的boost::asio
)boost::beast
一直试图调试这个几个小时。任何帮助表示赞赏
编辑
所以我知道我错在哪里了。Alan Birtles 和 Vinnie Falco 都是对的。在您的 ping 计时器到期(并且没有任何处理程序尚未返回)后关闭死 ssl 连接的方法是
- 在您的计时器处理程序中
对于 websocket
等待您的处理程序之一(通常是读取处理程序)返回错误(通常是 boost::asio::error::operation_aborted 错误)。从那里,排队开始下一次重新连接。(不要在第 1 步之后立即排队重新连接,这会导致我遇到的内存问题。我知道这是 asio 101,但很容易忘记)
对于重置套接字,只需要重置流
对于 websocket
c++ - 尝试使用 boost.beast 插入 mysql 时出错
我正在尝试将字符串插入 mysql 数据库并收到错误terminate called after throwing an instance of 'sql::SQLException' what(): Aborted (core dumped)
在尝试插入之前我已成功从数据库中获取表所以我不明白为什么当我尝试插入时 mysql 不喜欢它桌子。下面是我的服务器代码。
代码一直工作到我评论的地方//~~~~~~~HERE~~~~~~~
然后下面的行stmt1->executeQuery("INSERT INTO address (publicIP) VALUES ('"+temppubIP+"')");
导致错误。但即使服务器崩溃,它仍然会将字符串保存temppubIP
到 mysql db 表中。如果我注释掉 INSERT INTO 行,当客户端对其使用 GET 请求并接收数据库表时,服务器不会崩溃。所以我的目标是让服务器运行,当客户端连接到它时,服务器获取数据库表,然后将字符串发布到数据库,然后将数据库表发送回客户端。INSERT INTO 似乎是唯一不起作用的东西。
PS我是boost.asio和野兽的新手。我很确定我只需要连接到 mysql 一次,但是在尝试调试我遇到的这个问题时尝试了两个连接。
如果有人有任何见解或建议,非常感谢,谢谢!
c++ - boost::beast websocket异步读写连接丢失
我正在尝试使用 boost::beast 阅读 RocketChat websocket API。当我使用同步示例阅读它时它可以工作,但是当以某种方式使用 async_* 函数时,它似乎连接已关闭。
有问题的违规代码:
运行此代码会产生以下输出:
如果我在连接后不发送初始消息,则连接不会关闭。如果我不使用异步调用,而是使用同步版本,它也不会关闭。
我做错了可能是非常愚蠢的事情。如果我正确解释了文档,那么在 websocket 上启动读取和写入应该是有效的,只要它们是从同一个链完成的,并且由于我只有一个线程,我应该有一个隐式链。
我究竟做错了什么?
c++ - 将req传递给c ++中的方法时“不满足身体要求”(Boost Beast库)
我正在尝试将 req 传递给方法。我的代码是:
但是当我尝试编译它时,我收到了这个错误:
我该如何解决?
错误不是来自这些行,但如果我从代码中删除函数定义,它不会显示任何错误。
还有其他几个错误完全来自
c++ - Boost Beast Async Server Failing with Assertion failed: (id_ != T::id) 在多个 aync 调用上
断言失败:(id_!= T::id),函数 try_lock,文件 /usr/local/include/boost/beast/websocket/detail/stream_base.hpp,第 91 行。
我正在尝试使用 websocket 进行试验,目前当我接受接受时,我想逐行发送我从文件中读取的所有数据。
发送第一行后程序崩溃。请告知我做错了什么。
c++ - Boost (Beast) websocket:同步写入挂起
我遇到了 boost beast websocket 流的问题。当我尝试写入远程端点已停止响应的流时(特别是由于远程与网络物理断开连接),此问题会间歇性发生。
发生此问题时,同步 stream.write() 调用最终会挂起很长时间(几分钟),直到套接字最终关闭。我知道这种行为很可能是因为我的程序继续写入流而没有来自远程的确认,直到发送缓冲区已满。我想知道是否有一种方法可以对 write 调用应用超时,或者是否有一个更类似于 stream.try_write() 的接口,我可以在其中将错误处理提升到用户级别。
我确实意识到一种选择是使用 async_write 接口。但是,我担心这会将套接字写入操作推迟到 io_context 的下一次迭代,从而对我的发送性能产生负面影响。
下面是调用挂起时线程的堆栈跟踪。
c++ - 使用 Boost.Beast 异步读取标头
我尝试单独读取标题,但在使用任何主机时都会出错。
班级成员:
方法:
fail
的代码:
响应头:
此外,Boost.Beast 的开发者提出的代码不起作用——同样的错误。
提升版本 1.68
难道我做错了什么?
编辑:
在示例中是一个错字。它应该是:
但是异步读取头的主要问题并没有解决。
c++ - 增强 UE4 插件中的野兽集成问题?
我正在尝试创建一个 UE4 插件,然后我可以使用Boost Beast 客户端示例简单地创建一个蓝图函数:
但是当我尝试通过在我的 BoostBPFunctionLibrary.h 中包含以下头文件来简单地编译时:
我收到大量错误,如下所示。我猜这些错误都指向“AssertionMacros.h”中检查定义的冲突以及它的任何增强版本,但问题是我该如何解决这个问题并使其工作?为什么这两个定义之间没有明确的根本区别?我试图删除第一个错误行指出的“检查功能”的增强版本,但这会破坏增强中的其他代码文件,我尝试对 UE4 执行此操作,但答案仍然是否定的。我觉得这里有一些根本性的错误。请指教。
c++ - Boost Asio 和 Beast mulitpart/form-data 从 streambuf 保存二进制文件
我的结果看起来像...
购自
...本质上。因此,接收
给了我一个
这给了我http请求信息。但是在 multipart/form-data 的情况下,它读取通过了第一个边界,这意味着下一个 read() 看不到它。啊!(async_read_until() 也是如此。)所以,在
我转换
到一个字符串流并将它们加在一起以获得上面的 std::cout 结果。
我根本不相信我应该使用 stringstream。但上述例程(使用字符串流)在 Boost::Beast 中运行良好。它不在 Asio 中。不幸的是,在 Beast 中接收 http 请求的 string_body 类型有一个限制性的大小限制,我相信是 1 兆。不知道如何改变它。
我在任何地方都找不到关于这个主题的太多信息。也许,信息太危险了。如果他们告诉我,他们必须杀了我。我应该在 Asio 中使用什么将二进制数据写入磁盘?