2014-03-05 112 views
1

我有TCP服務器下面的代碼:如何支持通過升壓ASIO在TCP服務器連接多發

#include <algorithm> 

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/enable_shared_from_this.hpp> 
#include <boost/shared_ptr.hpp> 

#include <iostream> 
#include <string> 

using boost::asio::ip::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() 
    { 
    boost::asio::async_read_until(
     _socket 
     , _message 
     , "\r\n" 
     , boost::bind(
     &tcp_connection::handle_read 
     , this->shared_from_this() 
     , boost::asio::placeholders::error 
    ) 
    ); 
    } 

private: 
    tcp_connection(boost::asio::io_service& io_service) 
    : _socket(io_service) {} 

    void handle_read(const boost::system::error_code& error) 
    { 
    if (!error) 
    { 
     std::cout << &_message << '\n'; 
    } 
    } 

    tcp::socket _socket; 
    boost::asio::streambuf _message; 
}; 

class tcp_server 
{ 
public: 
    tcp_server(boost::asio::io_service& io_service) 
    : _acceptor(io_service, tcp::endpoint(tcp::v4(), 13)) 
    { 
    start_accept(); 
    } 

private: 
    void start_accept() 
    { 
    tcp_connection::pointer new_connection = 
     tcp_connection::create(_acceptor.get_io_service()); 

    _acceptor.async_accept(
     new_connection->socket() 
     , boost::bind(
     &tcp_server::handle_accept 
     , this 
     , new_connection 
     , boost::asio::placeholders::error 
    ) 
    ); 
    } 

    void handle_accept(
    tcp_connection::pointer new_connection 
    , const boost::system::error_code& error 
) 
    { 
    if (!error) 
    { 
     new_connection->start(); 
    } 

    start_accept(); 
    } 

    tcp::acceptor _acceptor; 
}; 

int main() 
{ 
    try 
    { 
    boost::asio::io_service io_service; 
    tcp_server server(io_service); 
    io_service.run(); 
    } 
    catch (const std::exception& ex) 
    { 
    std::cerr << ex.what() << '\n'; 
    } 
} 

我說得對,這個代碼不支持多個同時連接正確,因爲沒有按async_accept」在我們處理當前消息時是否激活?我的意思是:

void handle_accept(
    tcp_connection::pointer new_connection 
    , const boost::system::error_code& error 
    ) 
    { 
    // We are unable to accept new connections 
    if (!error) 
    { 
     new_connection->start(); 
    } 
    // before start_accept function call 

    start_accept(); 
    } 

如果是,我該如何解決這個問題?如何通過支持多連接的boost asio編寫一個簡約的異步TCP服務器?

回答

1

此代碼支持多個同時連接,因爲所使用的boost :: asio調用是異步的。 new_connection-> start()立即返回並調用start_accept()。

相關問題