You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost 1.73.0 Asio调用get_executor时编译错误求助

修复Boost.Asio TCP服务器的编译错误

针对你的Ubuntu 20.04LTS + Boost 1.73环境,代码存在两个核心问题,以下是修复方案:

修复后的完整代码

#include "server.h"
#include <iostream>

// 假设server.h中已包含:
// #include <boost/asio.hpp>
// using tcp = boost::asio::ip::tcp;

Server::Server(boost::asio::io_context& io_context, unsigned short port)
    : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)),
      io_context_(io_context) { // 保存io_context引用,方便后续使用
    start_accept();
}

void Server::start_accept() {
    // 方案1:用io_context直接构造socket(直观易读)
    tcp::socket socket(io_context_);
    
    acceptor_.async_accept(socket,
        [this](boost::system::error_code ec) { // 匹配async_accept(socket, handler)的签名
            handle_accept(std::move(socket), ec);
        }
    );

    // 方案2:改用无需提前创建socket的async_accept重载(更简洁)
    /*
    acceptor_.async_accept(
        [this](boost::system::error_code ec, tcp::socket socket) {
            handle_accept(std::move(socket), ec);
        }
    );
    */
}

void Server::handle_accept(tcp::socket socket, const boost::system::error_code& error) {
    if (!error) {
        std::cout << "New connection accepted." << std::endl;
    } else {
        std::cerr << "Error on accept: " << error.message() << std::endl;
    }
    start_accept();
}

错误原因解析

1. Socket构造逻辑错误

原代码tcp::socket socket(acceptor_.get_executor().context());的问题:

  • acceptor_.get_executor().context()返回的是boost::asio::execution_context对象,而Boost.Asio 1.73中该类没有get_executor()方法,这是你看到的核心编译错误根源。
  • 正确做法:直接用Server构造时传入的io_context&构造socket,或用acceptor的executor构造:tcp::socket socket(acceptor_.get_executor());。

2. Async_Accept Handler签名不匹配

原代码中handler签名是(boost::system::error_code ec, tcp::socket socket),但你调用的acceptor_.async_accept(socket, handler)重载,要求handler签名为void(error_code)——因为socket已提前创建传入,Asio不会再传递socket参数。

  • 若要使用带socket参数的handler,需改用无需提前创建socket的async_accept重载(即方案2的代码),此时Asio会自动创建socket并通过handler传递。

编译命令补充

编译时需链接Boost系统和线程库:

g++ -I include -std=c++17 -Wall src/server.cpp -o server -lboost_system -lboost_thread

内容的提问来源于stack exchange,提问作者truing Matthews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:29:50