在这个例子里,服务器对象主要使用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; };