我正在尝试编写一个简单的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!!
// ...
});
}
}
查看有关 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();
}