2010-06-17 3 views
4

부스트 asio에서 에코 서버 예제를 수정하려고하는데 boost :: asio :: async_read_until을 사용할 때 문제가 발생합니다. 내가하려고 할 때boost :: asio :: async_read_until 문제

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

using boost::asio::ip::tcp; 

class session 
{ 
public: 
    session(boost::asio::io_service& io_service) 
    : socket_(io_service) 
    { 
    } 

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

    void start() 
    { 
    std::cout<<"starting"<<std::endl; 
    boost::asio::async_read_until(socket_, boost::asio::buffer(data_, max_length), ' ', 
     boost::bind(&session::handle_read, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
    } 

    void handle_read(const boost::system::error_code& error, 
     size_t bytes_transferred) 
    { 
    std::cout<<"handling read"<<std::endl; 
    if (!error) 
    { 
     boost::asio::async_write(socket_, 
      boost::asio::buffer(data_, bytes_transferred), 
      boost::bind(&session::handle_write, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete this; 
    } 
    } 

    void handle_write(const boost::system::error_code& error) 
    { 
    if (!error) 
    { 
    /* 
     socket_.async_read_some(boost::asio::buffer(data_, max_length), 
      boost::bind(&session::handle_read, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
    */ } 
    else 
    { 
     delete this; 
    } 
    } 

private: 
    tcp::socket socket_; 
    enum { max_length = 1024 }; 
    char data_[max_length]; 
}; 

class server 
{ 
public: 
    server(boost::asio::io_service& io_service, short port) 
    : io_service_(io_service), 
     acceptor_(io_service, tcp::endpoint(tcp::v4(), port)) 
    { 
    session* new_session = new session(io_service_); 
    acceptor_.async_accept(new_session->socket(), 
     boost::bind(&server::handle_accept, this, new_session, 
      boost::asio::placeholders::error)); 
    } 

    void handle_accept(session* new_session, 
     const boost::system::error_code& error) 
    { 
    if (!error) 
    { 
     new_session->start(); 
     new_session = new session(io_service_); 
     acceptor_.async_accept(new_session->socket(), 
      boost::bind(&server::handle_accept, this, new_session, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     delete new_session; 
    } 
    } 

private: 
    boost::asio::io_service& io_service_; 
    tcp::acceptor acceptor_; 
}; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    if (argc != 2) 
    { 
     std::cerr << "Usage: async_tcp_echo_server <port>\n"; 
     return 1; 
    } 

    boost::asio::io_service io_service; 

    using namespace std; // For atoi. 
    server s(io_service, atoi(argv[1])); 

    io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 

문제 나는이 이상한 오류 얻을 컴파일 할 수있다 :

server.cpp : 멤버 함수 '무효 세션 : 시작()'에서 : server.cpp를 여기 코드는 : 27 : 오류 : 'async_read_until (부스트 :: asio :: basic_stream_socket> &, boost :: asio :: mutable_buffers_1, char, boost :: _ bi :: bind_t, boost :: _ bi :: list3, boost :: arg < 1> (), boost :: arg < 2> ()>

누군가가 무슨 일이 일어나는지 설명해 주시겠습니까? 내가 async_read_until에 대한 인수를 올바르게 말할 수 있는지.

감사합니다.

답변

7

async_read_until의 두 번째 인수는 streambuf object into which the data will be read이어야합니다. 간단히 말하자면 boost::asio::streambuf을 참조로 전달해야하며, 값으로 boost::asio::buffer이 아닙니다.

+0

컴파일하지 않고 말할 수있는 절대적인 분석 – manifest

0

const (in) 정확성으로 인해 이러한 유형의 오류 메시지가 발생할 수도 있습니다.

관련 문제