Async_Read函数的问题

时间:2015-07-23 11:24:51

标签: c++ boost tcp boost-asio

简介

我正在研究c++boost/asio来实现分布式系统,所以我需要创建一个异步tcp服务器。 服务器的工作方式类似于echo-server,但您需要先发出请求(例如,通过套接字发送文本),服务器只响应pi编号。

主服务器类中使用的Tcp连接类

class tcp_connection
    : public boost::enable_shared_from_this <tcp_connection> {
        public:
            typedef boost::shared_ptr<tcp_connection> pointer;

            static pointer create(boost::asio::io_service &io_service){
                return pointer(new tcp_connection(io_service));
            }

            tcp::socket &socket(){
                return socket_;
            }

            void start(){
                for(;;){

                    boost::asio::async_read(socket_, boost::asio::buffer(buffer_),
                        boost::bind(&tcp_connection::handle_read, shared_from_this(),
                         boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
                    );

                    buffer_ = "Pi: 3.1415\n\0";
                    boost::asio::async_write(socket_, boost::asio::buffer(buffer_),
                        boost::bind(&tcp_connection::handle_write, shared_from_this(),
                            boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
                }
            }
        private:
            tcp_connection(boost::asio::io_service &io_service)
                : socket_(io_service){
            }

            void handle_write(const boost::system::error_code& /*error*/,
                size_t /*bytes_transferred*/){
            }

             void handle_read(){
            }

            //attr
            tcp::socket socket_;
            std::string buffer_;
    };

问题

我已经在stackoverflow中阅读了一些教程和许多问题。我无法理解为什么我会犯这个错误:error: ‘void (tcp_connection::*)()’ is not a class, struct, or union type

我在此行找到了错误来源:boost::asio::async_read(...)。如果我删除该行,服务器工作正常,但我需要了解async_read功能以便以后实现复杂系统。

1 个答案:

答案 0 :(得分:1)

您的+---+---+---+---+ | | | | | +---+---+---+---+ 0 1 2 3需要一个处理程序 - 从套接字读取内容时将调用的函数。此处理程序应具有特定签名。在你的情况下,它应该像

async_read

只是因为你将它用作

void handle_read(boost::system::error_code const& ec, size_t bytes_transferred)

所以你绑定boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred) tcp_connection::handle_read(种类)(任何非静态方法的第一个隐式参数)和错误代码和传输的字节数,所以期望的签名是{{1} }。您可能需要详细了解this的工作原理:http://www.boost.org/doc/libs/1_58_0/libs/bind/doc/html/bind.html

作为奖励:

你的

void handle_read(boost::system::error_code const& ec, size_t bytes_transferred)

是同步方法。如果你想使用异步的,你需要不同的东西。主要的想法是链接它们,以便你的读取处理器和处理程序异步写入响应采用写入处理程序,写入处理程序启动另一个异步读取,因此循环。