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("\r\nResp: ")
	{
	}

	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;
};

你可能感兴趣的:(boost库在工作(32)网络服务端之二)