关于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
相关产品推荐
相关产品推荐

