boost库在工作 网络服务端

来源:互联网 发布:键盘记录软件 隐蔽 编辑:程序博客网 时间:2024/05/17 23:47
  1. //封装一个服务端类来处理网络。  
  2. //软件开发人员: 蔡军生  2013-07-28  
  3. //  
  4. class CConnect :   
  5.     public boost::enable_shared_from_this< CConnect >  
  6. {  
  7.     static const int MAX_BUFSIZE = 1024;  
  8. public:  
  9.     CConnect(boost::asio::io_service& ioService, CAllConnect& allConnect)  
  10.         :m_Socket(ioService),  
  11.         m_rAllConnect(allConnect),  
  12.         m_strHit("\r\nResp: ")  
  13.     {  
  14.     }  
  15.   
  16.     boost::asio::ip::tcp::socket& GetSocket(void)  
  17.     {  
  18.         return m_Socket;  
  19.     }  
  20.   
  21.     //发送的消息。  
  22.     void PushMsg(const std::string& strMsg)  
  23.     {  
  24.         m_QueueMsg.push_back(strMsg);  
  25.         //  
  26.         std::vector< boost::asio::const_buffer > vSendBuf;  
  27.         vSendBuf.push_back(boost::asio::buffer(m_strHit));  
  28.   
  29.         if (!m_QueueMsg.empty())  
  30.         {  
  31.             vSendBuf.push_back(boost::asio::buffer(m_QueueMsg.front()));  
  32.         }  
  33.         boost::asio::async_write(m_Socket,  
  34.             vSendBuf,  
  35.             boost::bind(&CConnect::HandleWrite, shared_from_this(),  
  36.             boost::asio::placeholders::error));  
  37.     }  
  38.   
  39.     void Start(void)  
  40.     {  
  41.         //添加管理连接集合。  
  42.         m_rAllConnect.Add(shared_from_this());  
  43.   
  44.         m_Socket.async_read_some(boost::asio::buffer(m_chBuffer, MAX_BUFSIZE),  
  45.             boost::bind(&CConnect::HandleRead, shared_from_this(),  
  46.             boost::asio::placeholders::error,  
  47.             boost::asio::placeholders::bytes_transferred));  
  48.     }  
  49.   
  50.     void HandleRead(const boost::system::error_code& error,  
  51.         size_t bytes_transferred)  
  52.     {  
  53.         if (!error)  
  54.         {  
  55.             std::vector< boost::asio::const_buffer > vSendBuf;  
  56.             vSendBuf.push_back(boost::asio::buffer(m_strHit));  
  57.                           
  58.             if (!m_QueueMsg.empty())  
  59.             {  
  60.                 vSendBuf.push_back(boost::asio::buffer(m_QueueMsg.front()));  
  61.             }  
  62.             vSendBuf.push_back(boost::asio::buffer(m_chBuffer, bytes_transferred));  
  63.             boost::asio::async_write(m_Socket,  
  64.                 vSendBuf,  
  65.                 boost::bind(&CConnect::HandleWrite, shared_from_this(),  
  66.                 boost::asio::placeholders::error));  
  67.         }  
  68.         else  
  69.         {  
  70.             //从连接集合里删除自己的连接。  
  71.             m_rAllConnect.Delete(shared_from_this());  
  72.         }  
  73.     }  
  74.   
  75.     void HandleWrite(const boost::system::error_code& error)  
  76.     {  
  77.         if (!error)  
  78.         {  
  79.             if (!m_QueueMsg.empty())  
  80.             {  
  81.                 m_QueueMsg.pop_front();  
  82.             }  
  83.   
  84.             m_Socket.async_read_some(boost::asio::buffer(m_chBuffer, MAX_BUFSIZE),  
  85.                 boost::bind(&CConnect::HandleRead, shared_from_this(),  
  86.                 boost::asio::placeholders::error,  
  87.                 boost::asio::placeholders::bytes_transferred));  
  88.         }  
  89.         else  
  90.         {  
  91.             //从连接集合里删除自己的连接。  
  92.             m_rAllConnect.Delete(shared_from_this());  
  93.         }  
  94.     }  
  95. private:  
  96.     //  
  97.     boost::asio::ip::tcp::socket m_Socket;  
  98.   
  99.     //  
  100.     boost::array<char, MAX_BUFSIZE> m_chBuffer;  
  101.     std::string m_strHit;  
  102.     std::deque< std::string > m_QueueMsg;  
  103.     //保存所有连接集合。  
  104.     CAllConnect& m_rAllConnect;  
  105. };  
  106.   
  107. //服务器,主要接收新连接,并启动新连接接收数据。  
  108. //软件开发人员: 蔡军生  2013-07-28  
  109. class CServer  
  110. {  
  111. public:  
  112.     //构造函数,主要提供IO服务和端口。  
  113.     CServer(boost::asio::io_service& ioService, short sPort)  
  114.         :m_ioService(ioService),   
  115.         m_acceptor(ioService, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), sPort))  
  116.     {  
  117.         //创建一个新连接,用来接收连接进来的客户端表示。  
  118.         boost::shared_ptr< CConnect > pConnect(new CConnect(m_ioService, m_allConnect));  
  119.         //做连接准备。  
  120.         m_acceptor.async_accept(pConnect->GetSocket(),  
  121.             boost::bind(&CServer::HandleAccept, this, pConnect,  
  122.             boost::asio::placeholders::error));   
  123.     }  
  124.   
  125.     //收到客户端连接进来事件响应。  
  126.     void HandleAccept(boost::shared_ptr< CConnect > pNewConnect,  
  127.         const boost::system::error_code& error)  
  128.     {  
  129.         if (!error)  
  130.         {  
  131.             //在这里可以通知别的连接有新连接进来。  
  132.             std::set< boost::shared_ptr< CConnect > >& rAll = m_allConnect.GetAllConnect();  
  133.             std::for_each(rAll.begin(), rAll.end(),  
  134.                 [&](boost::shared_ptr< CConnect > pOther)  
  135.                 {  
  136.                     pOther->PushMsg("Hello!");  
  137.             });  
  138.   
  139.             //如果没有错误,对连接进来的连接收发数据。  
  140.             pNewConnect->Start();  
  141.   
  142.             //创建新的连接,以备下一个客户端连接进来。  
  143.             pNewConnect.reset(new CConnect(m_ioService, m_allConnect));  
  144.             //做连接准备。  
  145.             m_acceptor.async_accept(pNewConnect->GetSocket(),  
  146.                 boost::bind(&CServer::HandleAccept, this, pNewConnect,  
  147.                 boost::asio::placeholders::error));  
  148.         }  
  149.     }  
  150.   
  151. private:  
  152.     //IO服务  
  153.     boost::asio::io_service& m_ioService;  
  154.     //接收器,用来接收新连接进来。  
  155.     boost::asio::ip::tcp::acceptor m_acceptor;  
  156.   
  157.     //管理所有连接。  
  158.     CAllConnect m_allConnect;  
  159. };  
  160.   
  161. //  
  162. int _tmain(int argc, _TCHAR* argv[])  
  163. {  
  164.     //创建一个IO服务  
  165.     boost::asio::io_service ioService;    
  166.     //创建服务器,端口为9001。  
  167.     CServer server(ioService, 9001);  
  168.   
  169.     //响应IO服务  
  170.     ioService.run();  
  171.   
  172.     return 0;  

0 0
原创粉丝点击