boost库在工作(34)网络服务端之四

现在来仔细地分析类CConnect,它主要作用就是管理一个连接的事务,比如数据接收和发送。因此类CConnect一定要有一个网络socket成员,它就是使用boost::asio::ip::tcp::socket类,这个类主要实现异步或同步的方式接收数据网络数据。在这个例子里,调用boost::asio::ip::tcp::socket类的async_read_some函数来进行异步读取数据,所谓异步就是只触一个读取的事件,并没有真正地等到数据到来,因此一调就立即返回了。async_read_some函数有一个特性,当IOCP接收到一次数据时,就立即放到它的缓冲区里,接着它就立即返回,不会判断读取到数据的长度,即使数据缓冲区里只有一个字节。在数据读取方面,有点特别,它不是调用boost::asio::ip::tcp::socket类的函数,而调用boost::asio::async_write函数来异步发送数据。boost::asio::async_write函数调用时要比较小心了,因为它是调用socketasync_write_some来发送数据,而socketasync_write_some每次发送数据的长度是不固定的,因而boost::asio::async_write函数会调用多次async_write_some来发送。使用boost::asio::async_write的好处,就是可以确保放到缓冲区里的数据,一定会发送出去,除非连接出错。而async_write_some不保证放到缓冲区里的数据都发送出去,只是尽可能地传送更多的数据,因此大多数情况之下,为了简单只会使用boost::asio::async_write。但这样一来,也有一个缺点在这里,就是不能在循环里调用boost::asio::async_write函数了,因为boost::asio::async_write发送一次数据时,只是保证自己的缓冲区的数据按顺序发送,多个boost::asio::async_write之间没有办法保证了。这里把上前面的例子代码改为多个缓冲区的数据合并到一个缓冲区来保证按顺序发送,如下:
//作者: 蔡军生
//QQ: 9073204

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

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