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)