boost库在工作 网络服务端
来源:互联网 发布:键盘记录软件 隐蔽 编辑:程序博客网 时间:2024/05/17 23:47
- //封装一个服务端类来处理网络。
- //软件开发人员: 蔡军生 2013-07-28
- //
- class CConnect :
- public boost::enable_shared_from_this< CConnect >
- {
- static const int MAX_BUFSIZE = 1024;
- public:
- CConnect(boost::asio::io_service& ioService, CAllConnect& allConnect)
- :m_Socket(ioService),
- m_rAllConnect(allConnect),
- m_strHit("\r\nResp: ")
- {
- }
- boost::asio::ip::tcp::socket& GetSocket(void)
- {
- return m_Socket;
- }
- //发送的消息。
- void PushMsg(const std::string& strMsg)
- {
- m_QueueMsg.push_back(strMsg);
- //
- std::vector< boost::asio::const_buffer > vSendBuf;
- vSendBuf.push_back(boost::asio::buffer(m_strHit));
- if (!m_QueueMsg.empty())
- {
- vSendBuf.push_back(boost::asio::buffer(m_QueueMsg.front()));
- }
- boost::asio::async_write(m_Socket,
- vSendBuf,
- boost::bind(&CConnect::HandleWrite, shared_from_this(),
- boost::asio::placeholders::error));
- }
- void Start(void)
- {
- //添加管理连接集合。
- m_rAllConnect.Add(shared_from_this());
- m_Socket.async_read_some(boost::asio::buffer(m_chBuffer, MAX_BUFSIZE),
- boost::bind(&CConnect::HandleRead, shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- void HandleRead(const boost::system::error_code& error,
- size_t bytes_transferred)
- {
- if (!error)
- {
- std::vector< boost::asio::const_buffer > vSendBuf;
- vSendBuf.push_back(boost::asio::buffer(m_strHit));
- if (!m_QueueMsg.empty())
- {
- vSendBuf.push_back(boost::asio::buffer(m_QueueMsg.front()));
- }
- vSendBuf.push_back(boost::asio::buffer(m_chBuffer, bytes_transferred));
- boost::asio::async_write(m_Socket,
- vSendBuf,
- boost::bind(&CConnect::HandleWrite, shared_from_this(),
- boost::asio::placeholders::error));
- }
- else
- {
- //从连接集合里删除自己的连接。
- m_rAllConnect.Delete(shared_from_this());
- }
- }
- void HandleWrite(const boost::system::error_code& error)
- {
- if (!error)
- {
- if (!m_QueueMsg.empty())
- {
- m_QueueMsg.pop_front();
- }
- m_Socket.async_read_some(boost::asio::buffer(m_chBuffer, MAX_BUFSIZE),
- boost::bind(&CConnect::HandleRead, shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- else
- {
- //从连接集合里删除自己的连接。
- m_rAllConnect.Delete(shared_from_this());
- }
- }
- private:
- //
- boost::asio::ip::tcp::socket m_Socket;
- //
- boost::array<char, MAX_BUFSIZE> m_chBuffer;
- std::string m_strHit;
- std::deque< std::string > m_QueueMsg;
- //保存所有连接集合。
- CAllConnect& m_rAllConnect;
- };
- //服务器,主要接收新连接,并启动新连接接收数据。
- //软件开发人员: 蔡军生 2013-07-28
- class CServer
- {
- public:
- //构造函数,主要提供IO服务和端口。
- CServer(boost::asio::io_service& ioService, short sPort)
- :m_ioService(ioService),
- m_acceptor(ioService, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), sPort))
- {
- //创建一个新连接,用来接收连接进来的客户端表示。
- boost::shared_ptr< CConnect > pConnect(new CConnect(m_ioService, m_allConnect));
- //做连接准备。
- m_acceptor.async_accept(pConnect->GetSocket(),
- boost::bind(&CServer::HandleAccept, this, pConnect,
- boost::asio::placeholders::error));
- }
- //收到客户端连接进来事件响应。
- void HandleAccept(boost::shared_ptr< CConnect > pNewConnect,
- const boost::system::error_code& error)
- {
- if (!error)
- {
- //在这里可以通知别的连接有新连接进来。
- std::set< boost::shared_ptr< CConnect > >& rAll = m_allConnect.GetAllConnect();
- std::for_each(rAll.begin(), rAll.end(),
- [&](boost::shared_ptr< CConnect > pOther)
- {
- pOther->PushMsg("Hello!");
- });
- //如果没有错误,对连接进来的连接收发数据。
- pNewConnect->Start();
- //创建新的连接,以备下一个客户端连接进来。
- pNewConnect.reset(new CConnect(m_ioService, m_allConnect));
- //做连接准备。
- m_acceptor.async_accept(pNewConnect->GetSocket(),
- boost::bind(&CServer::HandleAccept, this, pNewConnect,
- boost::asio::placeholders::error));
- }
- }
- private:
- //IO服务
- boost::asio::io_service& m_ioService;
- //接收器,用来接收新连接进来。
- boost::asio::ip::tcp::acceptor m_acceptor;
- //管理所有连接。
- CAllConnect m_allConnect;
- };
- //
- int _tmain(int argc, _TCHAR* argv[])
- {
- //创建一个IO服务
- boost::asio::io_service ioService;
- //创建服务器,端口为9001。
- CServer server(ioService, 9001);
- //响应IO服务
- ioService.run();
- return 0;
- }
0 0
- boost库在工作 网络服务端
- boost库在工作(31)网络服务端之一
- boost库在工作(32)网络服务端之二
- boost库在工作(33)网络服务端之三
- boost库在工作(31)网络服务端之一
- boost库在工作(32)网络服务端之二
- boost库在工作(34)网络服务端之四
- boost库在工作(35)网络服务端之五
- boost库在工作(36)网络服务端之六
- boost库在工作(37)网络UDP服务端之七
- boost库在工作(39)网络UDP异步服务端之九
- boost库在工作(26)网络客户端之一
- boost库在工作(27)网络客户端之二
- boost库在工作(28)网络客户端之三
- boost库在工作(29)网络客户端之四
- boost库在工作(30)网络客户端之五
- boost库在工作(26)网络客户端之一
- boost库在工作(27)网络客户端之二
- Listener死掉的一些原因
- 安卓端连接web端超时
- ORA-19909 datafile 1 belongs to …
- OracleserviceSID to write to net…
- ORA-01119和ORA-27040错误
- boost库在工作 网络服务端
- ORA-19909: datafile string belon…
- ORA-19573 cannot obtain string e…
- 关于外连接
- Android图片加载框架最全解析,Glide的基本用法
- 移动控制文件
- improve your python code(1)
- 看到两个list赋值 用Swap 函数,没有直接用=, 看下面原来Swap 有时候更高效。
- python机器学习实战2:实现决策树