育碧不配有妈妈、 2024-08-28 22:03 采纳率: 0%
浏览 4

boost::beast async_write 崩溃

boost::beast 客户端 async_write 时错误:

gdb 调试:
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
输入: IP_ADDR port
服务器 ip / 端口: 192.168.144.155 : 8080
ReadRequest : 2
HandleRequest str_filename: ./test.jpeg
HandleRequest str_file_content.size(): 0
SaveFile0
write successful
2
发送成功 准备回复

gdb 调试内容:

img

客户端:
y@jammy:~/HttpServer/src$ ./http_client
HTTP/1.1 200 OK
Server: Beast
Content-Type: text/plain
Content-Length: 43

File uploaded successfully --- finished !!!
收到了 服务器回复
然后服务器报错

img

  • 写回答

1条回答 默认 最新

  • 清水白石008 2024-08-29 05:41
    关注
    🕒上午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“生活中最重要的不是你所处的位置,而是你所朝的方向。” — 奥利弗·温德尔·霍姆斯
    

    在使用 Boost.Beast 的 async_write 时遇到崩溃问题,通常可能与以下几个方面有关:内存管理、异步操作的顺序、或是网络连接的状态。根据你提供的信息和 GDB 调试的输出,以下是一些可能的原因和解决方案。

    1. 检查内存管理

    确保在使用 async_write 时,所有传递给它的缓冲区(如 boost::beast::buffer)在写入操作完成之前都是有效的。如果缓冲区在写入操作完成之前被释放,可能会导致崩溃。

    2. 确保异步操作的顺序

    在使用 Boost.Beast 进行异步操作时,确保所有的异步操作(如 async_writeasync_read)都在正确的上下文中执行。特别是,确保在 async_write 完成之前,不要尝试关闭连接或释放相关资源。

    3. 检查错误处理

    async_write 的回调中,确保正确处理错误。以下是一个示例:

    boost::beast::async_write(socket, buffer, 
        [this](boost::beast::error_code ec, std::size_t bytes_transferred) {
            if (ec) {
                // 处理错误
                std::cerr << "Error during async_write: " << ec.message() << std::endl;
                return;
            }
            // 继续处理
        });
    

    4. 使用 GDB 调试

    在 GDB 中,使用 backtrace 命令查看崩溃时的调用栈。这可以帮助你确定崩溃发生的位置和原因。

    5. 检查服务器端代码

    确保服务器端代码在处理请求时没有问题。根据你提供的输出,服务器在处理请求时可能出现了问题。检查以下内容:

    • 确保文件路径和文件内容正确。
    • 确保在发送响应之前,所有的写入操作都已完成。
    • 检查服务器的日志,查看是否有其他错误信息。

    6. 示例代码

    以下是一个简单的 Boost.Beast 客户端和服务器的示例,展示如何正确使用 async_write

    客户端示例

    void send_request(boost::asio::ip::tcp::socket& socket) {
        // 构建请求
        std::string request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
        boost::asio::async_write(socket, boost::asio::buffer(request),
            [](boost::system::error_code ec, std::size_t /*length*/) {
                if (ec) {
                    std::cerr << "Error sending request: " << ec.message() << std::endl;
                }
            });
    }
    

    服务器示例

    void handle_request(boost::beast::http::request<boost::beast::http::string_body> req) {
        // 处理请求
        std::string response_body = "Hello, World!";
        boost::beast::http::response<boost::beast::http::string_body> res{
            boost::beast::http::status::ok, req.version()};
        res.set(boost::beast::http::field::server, "Beast");
        res.set(boost::beast::http::field::content_type, "text/plain");
        res.body() = response_body;
        res.prepare_payload();
    
        // 发送响应
        boost::beast::async_write(socket, res,
            [](boost::system::error_code ec, std::size_t /*bytes_transferred*/) {
                if (ec) {
                    std::cerr << "Error sending response: " << ec.message() << std::endl;
                }
            });
    }
    

    7. 其他建议

    • 确保 Boost 和 Boost.Beast 的版本是最新的,可能会修复一些已知的错误。
    • 如果问题仍然存在,考虑在 Boost 的 GitHub 仓库或相关论坛上寻求帮助,提供详细的错误信息和代码片段。

    希望这些建议能帮助你解决问题!如果有其他具体的错误信息或代码片段,请提供更多细节,以便更好地帮助你。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月28日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。