asio学习3: 异步tcp服务器端(datetime)

8 篇文章 0 订阅
#include  < ctime >
#include 
< iostream >
#include 
< boost / bind.hpp >
#include 
< boost / shared_ptr.hpp >
#include 
< boost / enable_shared_from_this.hpp >
#include 
< boost / asio.hpp >

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

std::
string  make_daytime_string()
{
    
using   namespace  std;
    time_t now 
=  time( 0 );
    
return  ctime( & now);
}

/*
 从enable_shared_from_this 派生的类,
 成员函数shared_from_this返回shared_ptr

 tcp_connection类管理新连接的socket,连接后发送时间字符串至客户端
*/
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()
    {
        message_ 
=  make_daytime_string();
        
/*
         *向新连接socket异步写数据
         *注意bind的用法(可以查看有关资料),这里是绑定类成员函数
         *第一个参数是类成员函数地址,第二个是该类变量指针或智能指针或类变量
         *后面是传递给类成员函数的各个参数,有几个就传递几个
         
*/
        boost::asio::async_write(socket_, boost::asio::buffer(message_),
            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::asio::error & /* error */ ,
        size_t
/* bytes_transferfed */ )
    {
    }
    tcp::socket socket_;
    std::
string  message_;
};


class  tcp_server
{
public :
    tcp_server(boost::asio::io_service
&  io)
        : acceptor_(io, tcp::endpoint(tcp::v4(),
13 ))
    {
        start_accept();
    }
private :
    
void  start_accept()
    {
        
// 创建新tcp_connection对象,成员变量socket_将会作为acceptor的参数
        tcp_connection::pointer new_connection  =
            tcp_connection::create(acceptor_.io_service());

        
// 等待接受新连接
        acceptor_.async_accept(new_connection -> socket(),
            boost::bind(
& tcp_server::handle_accept, this ,
            new_connection,boost::asio::placeholders::error));

    }

    
/*
     *当async_accept接受新连接完成后呼叫handle_accept
     *我们在这个函数中响应客户请求,并等待下个连接
     
*/
    
void  handle_accept(tcp_connection::pointer new_connection,
        boost::asio::error
& error)
    {
        
if ( ! error)
        {
            new_connection
-> start();
            start_accept();
        }

    }
private :
    
/*
    /// TCP socket 类型.
    typedef basic_stream_socket<tcp> socket;
    /// TCP acceptor 类型.
    typedef basic_socket_acceptor<tcp> acceptor;
    
*/
    tcp::acceptor acceptor_;
};

/*
    io_service 类为异步i/o对象的用户提供核心 i/o功能(在windows2000以上环境使用完成端口)
    如: 
        boost::asio::ip::tcp::socket
        boost::asio::ip::tcp::acceptor
        boost::asio::ip::udp::socket
        boost::asio::deadline_timer
*/
int  _tmain( int  argc, _TCHAR *  argv[])
{
    
try {
        boost::asio::io_service io;
        tcp_server server(io);
        io.run();
    }
    
catch (std::exception &  e)
    {
        std::cerr 
<<  e.what()  <<  std::endl;
    }
    
return   0 ;
}
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值