boost :: asio :: io_service用于检索main中的数据

时间:2011-08-12 04:17:33

标签: c++ boost-asio

遇到以下代码(来自user368831),这正是我要找的。我已经修改了一点,使它成为一个线程TCP会话,监听和读取连接和数据,而主循环可以执行其他任务。

class CSession
{
public:
    CSession(boost::asio::io_service& io_service) : m_Socket(io_service)
    {}

    tcp::socket& socket() return m_Socket;

    void start()
    {
        boost::asio::async_read_until(m_Socket, m_Buffer, " ",
                                      boost::bind(&CSession::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)
    {
        if (!error)
        {
            ostringstream ss;
            ss << &m_Buffer;
            m_RecvMsg = ss.str();
            std::cout << "handle_read():" << m_RecvMsg << std::endl;
        }
        else
            delete this;
    }    

private:
    boost::asio::streambuf  m_Buffer;
    tcp::socket             m_Socket;
    string                  m_RecvMsg;
};

class CTcpServer
{
public:
    CTcpServer(short port)
    : m_Acceptor(m_IOService, tcp::endpoint(tcp::v4(), port)),
    m_Thread(boost::bind(&boost::asio::io_service::run, &m_IOService))
    {        
        CSession* new_session = new CSession(m_IOService);

        m_Acceptor.async_accept(new_session->socket(),
                                boost::bind(&CTcpServer::handle_accept, this, new_session,
                                boost::asio::placeholders::error));
    };

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

private:
    boost::asio::io_service m_IOService;
    tcp::acceptor           m_Acceptor;
    boost::thread           m_Thread;

};

void main()
{
      :
    CTcpServer *server = new CTcpServer(6002); // tcp port 6002
    /* How to get the incoming data sent from the client here?? */
    // string message;
    // while(1)
    // {
    //    if ( server->incomingData(message) )
    //    {
    //      std::cout << "Data recv: " << message.data() << std::endl;
    //    }
    //      :
    //      : // other tasks
    //      :
    // } 
}

但是,如何在主循环中对incomingData()进行编码,以便它监视来自客户端的数据并在调用handle_read()时返回true?

在这种情况下可以使用Boost :: signals库吗?

1 个答案:

答案 0 :(得分:1)

这段代码坦率地说是可怕的。由于你使用原始指针的方式,有很多内存泄漏。 Asio最适合shared_ptr,它需要保证对象的生命周期。我建议你把这个代码丢掉,然后从asio的简单开始看一下这个例子。

至于你想要编码的方法 - 这不是它的工作方式,你应该把这个逻辑放在handle_read中。根据您的协议获得完整消息时,将调用handle_read,您应该在此方法中放置您想要发生的逻辑 - 而不是在主while循环中。在主线程中,您只需拨打io_service::run()