Boost.asio async_read_some编译错误

时间:2012-12-21 00:18:56

标签: c++ boost c++11 boost-asio

我遇到了async_read_some

的问题

我使用async_write_some进行编译,结果很好。

但是,我尝试使用async_read_some进行编译,

并提出了奇怪的错误,它可以找到正确的方法。

我是新手,以促进世界.Plz帮我解决这些问题。

提前致谢。

Opps编译器错误就像这样

错误:没有匹配函数来调用' ws_async_tcp_connection :: async_recv_msg_some(boost :: asio :: mutable_buffers_1,boost :: _ bi :: bind_t,boost :: _ bi :: list3,boost :: arg< 1> ;()(),boost :: arg< 2>()()>>)' /home/chris/proto/inc/ws_async_tcp_connection.h:119:注意:候选人是:void ws_async_tcp_connection :: async_recv_msg_some(T&,Handler)[使用T = boost :: asio :: mutable_buffers_1,Handler = boost :: _ bi: :bind_t,boost :: _ bi :: list3,boost :: arg< 1> ()(),boost :: arg< 2> ()()> >]

header 
-----------------------------------------------------------------------------------
class ws_async_tcp_connection{
    boost::asio::ip::tcp::socket socket_;
public:

    ws_async_tcp_connection(boost::asio::io_service& arg_io_service)
        : socket_(arg_io_service){}


    /*
    *   destructor
    */      
    ~ws_async_tcp_connection(){
        shutdown();
    }


    /*
    *   connect method
    *       : binding connection handler -> handle_connect
    */
    void connect(const std::string& host_addr, const std::string& port_no){
        boost::asio::ip::tcp::resolver resolver_(socket_.get_io_service());
        boost::asio::ip::tcp::resolver::query query_(boost::asio::ip::tcp::v4(), host_addr, port_no);
        boost::asio::ip::tcp::resolver::iterator end_point_iter = resolver_.resolve(query_);
        boost::asio::async_connect(socket_, end_point_iter, 
            boost::bind(&ws_async_tcp_connection::handle_connect, this, boost::asio::placeholders::error));
    }


    /*
    *   handle_connect
    *       : handle after the connect method called
    */
    void handle_connect(const boost::system::error_code& ec){
        if(!ec){
            // successfully established the connection - maybe print the remote ip, port
            /*  getting the remote_endpoint ip, port
            std::string connected_server_ip = socket_.remote_endpoint().address().to_string();
            unsigned short connected_server_port = socket_.remote_endpoint().port();
            */
        }
        else{
            // error handling - maybe use Logger class to print the error
            shutdown();
        }
    }


    /*
    *   set_option
    *       : set option for the tcp socket
    */
    template<typename SettableSocketOption>
    void set_option(const SettableSocketOption& option){
        // if performance is poor, then let's try no_delay option(true);
        /* keepalive option
            boost::asio::socket_base::keep_alive option(true);
            socket.set_option(option);
        */
        socket_.set_option(option);
    }


    /*
    *   is_open
    *       : socket is opened or not
    */
    bool is_open(){
        return socket_.is_open();
    }

    /*
    *   async_send_msg
    *       : send msg (warning! : will be blocked until the exact bytes you ask for are transmitted)
    */
    template <typename T, typename Handler> 
    void async_send_msg(const T& send_buf, Handler handler){
        boost::asio::async_write(socket_, send_buf, handler);
    }


    /*
    *   async_recv_msg
    *       : recv msg (warning! : will be blocked until the exact bytes you ask for are transmitted)
    */
    template <typename T, typename Handler> 
    void async_recv_msg(T& recv_buf, Handler handler){
        boost::asio::async_read(socket_, recv_buf, handler);
    }

    /*
    *   async_send_msg_some
    *       : send msg
    */  
    template <typename T, typename Handler> 
    void async_send_msg_some(const T& send_buf, Handler handler){
        socket_.async_write_some(send_buf, handler);
    }


    /*
    *   async_recv_msg_some
    *       : recv msg (Typically use this if you don't have to receive the exact numbers of bytes)
    */
    template <typename T, typename Handler> 
    void async_recv_msg_some(T& recv_buf, Handler handler){
        socket_.async_read_some(recv_buf, handler);
    }


    /*
    *   shutdown
    */
    void shutdown(){
        if(is_open()){
            boost::system::error_code ec;
            socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
            if(ec){
                // may print shutdown error
            }
            socket_.close();
        }
    }

    /*
    *   socket
    *       : returning the current holding socket
    */
    boost::asio::ip::tcp::socket& socket(){
        return socket_;
    }
};

typedef boost::shared_ptr<ws_async_tcp_connection> async_tcp_ptr;


-------------------------------------------------------------------------------
src
-------------------------------------------------------------------------------

class async_tcp_test_server{
    enum{ buf_size = 1024 };
    boost::asio::ip::tcp::acceptor acceptor_;
    boost::array<char, buf_size> send_buf;
    boost::array<char, buf_size> recv_buf;
public:
    async_tcp_test_server(boost::asio::io_service& io_service, unsigned short port_no)
        : acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port_no)){

        // start an accept operation for a new connection
        async_tcp_ptr new_conn(new ws_async_tcp_connection(acceptor_.get_io_service()));
        acceptor_.async_accept(new_conn->socket(), boost::bind(&async_tcp_test_server::handle_accept, this,
            boost::asio::placeholders::error, new_conn));
    }

    void handle_accept(const boost::system::error_code& ec, async_tcp_ptr conn){

        if(!ec){
            send_buf.assign(0x00);
            string hello_str = "Welcome to connect Asynchronous TCP Test Server :)";
            memcpy(&send_buf[0], hello_str.c_str(), hello_str.length());
            conn->async_send_msg(boost::asio::buffer(send_buf), boost::bind(&async_tcp_test_server::handle_write, this, boost::asio::placeholders::error, conn));
            //conn->async_send_msg_some(boost::asio::buffer(send_buf), boost::bind(&async_tcp_test_server::handle_write, this, boost::asio::placeholders::error, 
                //boost::asio::placeholders::bytes_transferred, conn));
        }

        // start an accept operation for new connection
        async_tcp_ptr new_conn(new ws_async_tcp_connection(acceptor_.get_io_service()));
        acceptor_.async_accept(new_conn->socket(), boost::bind(&async_tcp_test_server::handle_accept, this,
            boost::asio::placeholders::error, new_conn));
    }


    void handle_write(const boost::system::error_code& ec, async_tcp_ptr conn){
        if(!ec){
            recv_buf.assign(0x00);
            conn->async_recv_msg_some(boost::asio::buffer(recv_buf), boost::bind(&async_tcp_test_server::handle_read, this, boost::asio::placeholders::error, 
                boost::asio::placeholders::bytes_transferred));
        }
    }


    void handle_read(const boost::system::error_code& ec, size_t num_recv_bytes){
        cout << recv_buf.data() << endl;
    }
};


int main(void)
{
    unsigned short port_no = 7807;
    boost::asio::io_service io_svr;
    async_tcp_test_server test_server(io_svr, port_no);
    io_svr.run();
}

以下是错误输出(在我改变T&amp; - &gt; const T&amp;之后)

/home/chris/proto/boost/boost/bind/bind_template.hpp:15:从&#39; boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt;实例化()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &GT;&#39; async_tcp_test_server.cpp:46:从这里实例化 /home/chris/proto/boost/boost/bind/bind.hpp:69:错误:&#39; void(async_tcp_test_server :: *)(const boost :: system :: error_code&amp;,size_t)&#39;不是类,结构或联合类型 /home/chris/proto/boost/boost/asio/basic_stream_socket.hpp:在成员函数&#39; void boost :: asio :: basic_stream_socket :: async_read_some(const MutableBufferSequence&amp;,const ReadHandler&amp;)[with MutableBufferSequence = boost: :asio :: mutable_buffers_1,ReadHandler = boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &gt;,Protocol = boost :: asio :: ip :: tcp,StreamSocketService = boost :: asio :: stream_socket_service]&#39;: /home/chris/proto/inc/ws_async_tcp_connection.h:120:从&#39; void ws_async_tcp_connection :: async_recv_msg_some(const T&amp;,Handler)实例化[使用T = boost :: asio :: mutable_buffers_1,Handler = boost :: _bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &GT;]&#39; async_tcp_test_server.cpp:46:从这里实例化 /home/chris/proto/boost/boost/asio/basic_stream_socket.hpp:785:错误:无法调用&#39;(boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt;( )(),boost :: arg&lt; 2&gt;()(),boost :: _ bi :: value&gt;&gt;&gt;)(const boost :: system :: error_code&amp;,const long unsigned int&amp; )&#39; /home/chris/proto/boost/boost/asio/detail/bind_handler.hpp:在成员函数&#39; void boost :: asio :: detail :: binder2 :: operator()()[with Handler = boost: :_bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &gt;,Arg1 = boost :: system :: error_code,Arg2 = long unsigned int]&#39;: /home/chris/proto/boost/boost/asio/handler_invoke_hook.hpp:64:从&lt; void boost :: asio :: asio_handler_invoke(函数,...)实例化[与Function = boost :: asio :: detail :: binder2,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &gt;,boost :: system :: error_code,long unsigned int&gt;]&#39; /home/chris/proto/boost/boost/asio/detail/handler_invoke_helpers.hpp:39:从&lt; void boost_asio_handler_invoke_helpers :: invoke(函数&amp;上下文&amp;)实例化[与Function = boost :: asio :: detail :: binder2,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &gt;,boost :: system :: error_code,long unsigned int&gt;,Context = boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &GT;]&#39; /home/chris/proto/boost/boost/asio/detail/reactive_socket_recv_op.hpp:110:实例化为&#39; static void boost :: asio :: detail :: reactive_socket_recv_op :: do_complete(boost :: asio :: detail :: io_service_impl *,boost :: asio :: detail :: operation *,const boost :: system :: error_code&amp;,size_t)[with MutableBufferSequence = boost :: asio :: mutable_buffers_1,Handler = boost :: _ bi :: bind_t ,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &GT;]&#39; /home/chris/proto/boost/boost/asio/detail/reactive_socket_recv_op.hpp:80:从&#39; boost :: asio :: detail :: reactive_socket_recv_op :: reactive_socket_recv_op实例化(boost :: asio :: detail :: socket_type,boost :: asio :: detail :: socket_ops :: state_type,const MutableBufferSequence&amp;,int,Handler&amp;)[with MutableBufferSequence = boost :: asio :: mutable_buffers_1,Handler = boost :: _ bi :: bind_t,boost :: ARG&LT 1为卤素; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &GT;]&#39; /home/chris/proto/boost/boost/asio/detail/reactive_socket_service_base.hpp:273:从&lt; void boost :: asio :: detail :: reactive_socket_service_base :: async_receive实例化(boost :: asio :: detail: :reactive_socket_service_base :: base_implementation_type&amp;,const MutableBufferSequence&amp;,int,Handler)[with MutableBufferSequence = boost :: asio :: mutable_buffers_1,Handler = boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &GT;]&#39; /home/chris/proto/boost/boost/asio/stream_socket_service.hpp:318:从&lt; void boost :: asio :: stream_socket_service :: async_receive实例化(typename boost :: asio :: detail :: reactive_socket_service :: implementation_type&amp;,const MutableBufferSequence&amp;,int,const ReadHandler&amp;)[with MutableBufferSequence = boost :: asio :: mutable_buffers_1,ReadHandler = boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &gt;,Protocol = boost :: asio :: ip :: tcp]&#39; /home/chris/proto/boost/boost/asio/basic_stream_socket.hpp:787:从&lt; void boost :: asio :: basic_stream_socket :: async_read_some(const MutableBufferSequence&amp;,const ReadHandler&amp;)实例化[与MutableBufferSequence = boost :: asio :: mutable_buffers_1,ReadHandler = boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &gt;,Protocol = boost :: asio :: ip :: tcp,StreamSocketService = boost :: asio :: stream_socket_service]&#39; /home/chris/proto/inc/ws_async_tcp_connection.h:120:从&#39; void ws_async_tcp_connection :: async_recv_msg_some(const T&amp;,Handler)实例化[使用T = boost :: asio :: mutable_buffers_1,Handler = boost :: _bi :: bind_t,boost :: arg&lt; 1&gt; ()(),boost :: arg&lt; 2&gt; ()(),boost :: _ bi :: value&gt; &GT; &GT;]&#39; async_tcp_test_server.cpp:46:从这里实例化 /home/chris/proto/boost/boost/asio/detail/bind_handler.hpp:118:错误:调用&#39;(boost :: _ bi :: bind_t,boost :: arg&lt; 1&gt;(< em>)(),boost :: arg&lt; 2&gt;()(),boost :: _ bi :: value

1 个答案:

答案 0 :(得分:2)

正如编译器所说,您正在调用的函数需要对缓冲区的非const引用: async_recv_msg_some(T&, ... [with T = boost::asio::mutable_buffers_1

您按值传递缓冲区:async_recv_msg_some(boost::asio::mutable_buffers_1,因为您将其创建为具有右值表达式boost::asio::buffer(recv_buf)的临时对象。

您必须更改功能签名才能采用Tconst T&(我会选择const T&,因为这是async_read_some所采用的功能,以及您的功能只是转发到那个)

相关问题