zoukankan      html  css  js  c++  java
  • boost库在工作(32)网络服务端之二

    在这个例子里,服务器对象主要使用boost::asio::io_service对象,这个对象主要用来构造异步接收数据使用,接着定义boost::asio::ip::tcp::acceptor对象,这个对象主要用来接收所有连接进来到服务器的连接,也就是起到监听的作用。在服务器类的构造函数里主要调用接受对象的async_accept方法发起监听连接的作用,就是等着客户端连接过来,如果不发起连接,是收不到任何连接的。当服务器收到一个客户端连接进来时,就会响应函数CServer类的HandleAccept函数,在这个函数里主要做以下工作:把刚连接进来的连接启动处理这个客户端的数据,然后创建一个新连接,以便接收下一个客户端连接进来。在上面的代码里,可以看到使用boost::shared_ptr智能指针,这样每个连接都是使用共享智能指针的方式来管理,只要这个连接存在,就不会删除连接占用的内存。下面来仔细地看连接处理的代码,如下:

    //封装一个服务端类来处理网络。
    //软件开发人员: 蔡军生  2013-06-30
    //
    class CConnect : 
    	public boost::enable_shared_from_this< CConnect >
    {
    	static const int MAX_BUFSIZE = 1024;
    public:
    	CConnect(boost::asio::io_service& ioService)
    		:m_Socket(ioService),
    		m_strHit("
    Resp: ")
    	{
    	}
    
    	boost::asio::ip::tcp::socket& GetSocket(void)
    	{
    		return m_Socket;
    	}
    
    	void Start(void)
    	{
    		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)
    		{
    			boost::asio::async_write(m_Socket,
    				boost::asio::buffer(m_strHit),
    				boost::bind(&CConnect::HandleWrite, shared_from_this(),
    				boost::asio::placeholders::error));
    			boost::asio::async_write(m_Socket,
    				boost::asio::buffer(m_chBuffer, bytes_transferred),
    				boost::bind(&CConnect::HandleWrite, shared_from_this(),
    				boost::asio::placeholders::error));
    		}
    	}
    
    	void HandleWrite(const boost::system::error_code& error)
    	{
    		if (!error)
    		{
    			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));
    		}
    	}
    private:
    	//
    	boost::asio::ip::tcp::socket m_Socket;
    
    	//
    	boost::array<char, MAX_BUFSIZE> m_chBuffer;
    	std::string m_strHit;
    };
    


  • 相关阅读:
    转载Python中__getattr__ __getattribute__ __get__解释
    python异常介绍
    Javascript创建对象的几种方式
    python类高级话题
    python运算符重载2
    python运算符重载
    python面向对象编程基础
    PHP学习之提示标签
    Web自动化测试构建学习小结(二)
    Web自动化测试构建学习小结(一)
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3177733.html
Copyright © 2011-2022 走看看