如何使用beast::http::async_read

问题描述 投票:0回答:1

我正在尝试编写一个简单的http服务器。虽然

beast::http::read
正常工作,但异步版本根本不调用处理程序(当尝试获取
http://localhost:8080/
时)

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/beast.hpp>

namespace asio = boost::asio;
namespace beast = boost::beast;
using tcp = asio::ip::tcp;

int main()
{
    asio::io_context m_io_context;
    tcp::acceptor m_acceptor(m_io_context, {tcp::v4(), 8080});
    tcp::socket m_socket(m_io_context);
    beast::flat_buffer buffer;
    beast::http::request<beast::http::string_body> request;

    m_acceptor.accept(m_socket);

    while (true)
    {
        // Do something...
        //beast::http::read(m_socket, buffer, request);  // This works well
        beast::http::async_read(
            m_socket, buffer, request,
            [](const beast::error_code& ec, std::size_t bytes_transferred)
            {
                // This function is never being called!!
                // ...
            });
    }
}
c++ boost-asio
1个回答
0
投票

查看有关 async_read 的 boost 文档,函数调用总是立即返回。因此您的回调将不会被处理,要使其工作,您需要执行 m_io_context 对象的 run。查看 boost 文档示例

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/beast.hpp>

namespace asio = boost::asio;
namespace beast = boost::beast;
using tcp = asio::ip::tcp;

int main()
{
    asio::io_context m_io_context;
    tcp::acceptor m_acceptor(m_io_context, {tcp::v4(), 8080});
    tcp::socket m_socket(m_io_context);
    beast::flat_buffer buffer;
    beast::http::request<beast::http::string_body> request;

    m_acceptor.accept(m_socket);

    beast::http::async_read(
        m_socket, buffer, request,
        [](const beast::error_code& ec, std::size_t bytes_transferred)
        {
            // start the next async read here
        });

    m_io_context.run();
}
© www.soinside.com 2019 - 2024. All rights reserved.