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

关于boost::asio::placeholders::error的正确使用及代码修正问询

Boost.Asio服务器代码的参数绑定错误修正

这段基于Boost.Asio实现的TCP服务器代码存在一处参数绑定错误,以下是问题分析与修正方案:

问题说明

在Server::start_accept函数的异步accept绑定逻辑中,占位符使用错误:

acceptor_.async_accept(connection->socket(),
  boost::bind(&Server::handle_accept, this, connection,
    boost::asio::placeholders::error));

根据Boost官方定义,asio::placeholders::error等价于boost::placeholders::_1,但Server::handle_accept的函数签名为:

void handle_accept(con_handler::pointer connection, const boost::system::error_code& err)

其中error_code是第二个参数,原代码用_1(即asio::placeholders::error)会导致参数错位,触发未定义行为。

修正后的代码片段

将占位符替换为boost::placeholders::_2:

acceptor_.async_accept(connection->socket(),
  boost::bind(&Server::handle_accept, this, connection,
    boost::placeholders::_2));

完整修正后的服务器代码

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/enable_shared_from_this.hpp>

using namespace boost::asio;
using ip::tcp;
using std::cout;
using std::endl;


class con_handler : public boost::enable_shared_from_this<con_handler>
{
private:
  tcp::socket sock;
  std::string message="Hello From Server!";
  enum { max_length = 1024 };
  char data[max_length];
    
public:
    
typedef boost::shared_ptr<con_handler> pointer;
 con_handler(boost::asio::io_service& io_service)
    : sock(io_service)
  {
  }

  static pointer create(boost::asio::io_service& io_service)
  {
    return pointer(new con_handler(io_service));
  }
  
  tcp::socket& socket()
  {
    return sock;
  }

  void start()
  {
    sock.async_read_some(
        boost::asio::buffer(data, max_length),
        boost::bind(&con_handler::handle_read,
                    shared_from_this(),
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));

    
    sock.async_write_some(
    boost::asio::buffer(message, max_length),
        boost::bind(&con_handler::handle_write, 
            shared_from_this(),
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));
  }

  void handle_read(const boost::system::error_code& err,
                   size_t bytes_transferred)
  {
    if (!err) {
      cout << data << endl;

    } else {
std::cerr << "err (recv): " << err.message() << std::endl;
      sock.close();
    }
  }
  void handle_write(const boost::system::error_code& err,
               size_t bytes_transferred)
  {
    if (!err) {
 
    cout << "Server sent Hello message!"<< endl;
    
    } else {
      std::cerr << "err (recv): " << err.message() << std::endl;
      sock.close();
    }
  }

};

class Server {

private:
  tcp::acceptor acceptor_;

void start_accept()
  {
    // 创建socket
    con_handler::pointer connection =
      con_handler::create(acceptor_.get_io_service());

    // 启动异步accept操作等待新连接
    acceptor_.async_accept(connection->socket(),
        boost::bind(&Server::handle_accept, this, connection,
          boost::placeholders::_2)); // 此处已修正占位符
  }
public:
  Server(boost::asio::io_service& io_service): acceptor_(io_service, tcp::endpoint(tcp::v4(), 1234))
  { 
     start_accept();
}
    

  void handle_accept(con_handler::pointer connection,
                     const boost::system::error_code& err)
  {
    if (!err) {
      connection->start();
    }
    start_accept();
  }

};

int main(int argc, char *argv[])
{
  try 
{
    boost::asio::io_service io_service;   
    Server server(io_service);
    io_service.run();

} 
catch(std::exception& e) 
{
    std::cerr << e.what() << endl;
}
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:35:16