利用boost::asio实现一个简单的服务器框架

8 篇文章 0 订阅
 boost::asio是一个高性能的网络开发库,Windows下使用IOCP,Linux下使用epoll。与ACE不同的是,它并没有提供一个网络框架,而是采取组件的方式来提供应用接口。但是对于常见的情况,采用一个好用的框架还是能够简化开发过程,特别是asio的各个异步接口的用法都相当类似。
  受到  SP Server 框架的影响,我使用asio大致实现了一个多线程的半异步半同步服务器框架,以下是利用它来实现一个Echo服务器:

1. 实现回调:
static   void  onSessionStarted(SessionPtr  const &  session)
{
       session
->setReadMode(Session::READ_LINE); // 设置为行读取
}


static   void  onSession(  SessionPtr  const &  session)
{
       print(session
->getMsg()); //打印收到的消息
       session->addReply(session->getMsg()); //回送消息
       session->close();
}

说明:close()是一个关闭请求,它并不马上关闭Session,而是等待所有与该Session相关的异步操作全部结束后才关闭。

2. 一个单线程的Echo服务器:
void  server_main()
{
    unsigned short port = 7;
    AsioServer server(
port );

    server.sessionStarted 
=   & onSessionStarted;
    server.sessionHandle 
=   & onSession;

    server.run();
}


3. 一个多线程的Echo服务器(半异步半同步:一个主线程,4个工作者线程)
void  server_main2()
{
    unsigned short port = 7;
    AsioServer server(port
);
    AsioService worker;

    server.sessionStarted 
=  worker.wrap( & onSessionStarted);
    server.sessionHandle 
=  worker.wrap( & onSession);

     int num_threads = 4;
     server.runWithWorkers(worker, 
num_threads );
}

  其中主要用到了两个类,Session和AsioServer,大约有以下接口:
struct  Session
{
    
void  setReadMode( int  mode);
    
string  getMsg();
    
    
void  addReply( string   const & );
    
    
void  close();
    void  post();     //  stop pending
    
    
string      getError();
    
    Endpoint localEndpoint();
    Endpoint remoteEndpoint();
    
   shared_ptr
< void >     userData;
};

struct  AsioService
{
    
void  run();  
    
void  stop(); 
    
void  post(function < void () > const & ); 
    
    template 
< typename F >  SessionWrapper < F >  wrap(F  const &  f);
};

struct  AsioServer :  public  AsioService
{
    typedef boost::function
< void (SessionPtr  const & ) >  callback_t;

    AsioServer(unsigned 
short  port);
    
    callback_t   sessionStarted;
    callback_t   sessionHandle;
    callback_t   sessionClosed;
    callback_t   sessionError;
    function
< std:: string >    error;

    
void  runWithWorkers(AsioService &  worker, size_t num_threads);  //  HS-HA pattern
};

  有了这样一个思路,实现起来就很容易了。重点是以下两点:
  1。缓冲区的管理与内存池的使用
  2。为了保证Session的线程安全,必须要设置一个挂起状态。
         
    还有一个好处,就是完全隔绝了asio的应用接口,不用再忍受asio漫长的编译时间了。代码就不贴在这里了,有兴趣的可以通过email 探讨。

  原文地址:  http://www.cppblog.com/eXile/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值