ACE第三个练习:ACE_Message_Block类

/**
	这个程序作用:
		1.把所有的数据从标准输入读入到一个动态分配的ACE_Message_Black的单向链表中
		2.这些ACE_Message_Black通过它们的后续指针连接在一起
		3.所ACE_Message_Black链表中的所有连接的消息块打印到标准输出设备上
		4.释放1中动态分配的内存
*/

#include "ace/ACE.h"
#include "ace/Message_Block.h"

int main(int argc, char* argv[])
{
	ACE_Message_Block* head = new ACE_Message_Block(BUFSIZ);		// 头指针
	ACE_Message_Block* mblk = head;									// mblk 即: message block

	for (size_t recvd = -1; ; recvd = -1)
	{
		/**
			ACE::read_n()
			@功能: 会试图读取buf长度的数据;
			@retrun: 如果遇到文件结束(EOF)或者错误则返回 0 或 -1,如果先到达了buf长度则返回数据区长度
			@param4 记录了实际读取的数据长度.
			@mark 
				这里的mblk->size() = BUFSIZ = 512,
				如果( 你的输入字节 < mblk->size() && read_n != EOF && read_n != 0 )
					则read_n函数处于等待状态,不会执行下一条语句
		*/
		ssize_t nbytes = ACE::read_n(ACE_STDIN, mblk->wr_ptr(), mblk->size(), &recvd);

		// 把写指针推进到缓冲区的末端
		mblk->wr_ptr(recvd);

		// 如果遇到EOF或错误,则退出循环
		if (nbytes <= 0) break; 

		// 分配消息块并把它存放在链表的尾部
		mblk->cont(new ACE_Message_Block(BUFSIZ));

		mblk = mblk->cont();
	}

	// 把链表中的内空打印到标准输出上
	/**
		以下for循环可以用:
			ACE::write_n(ACE_STDOUT, head);
		代替;
			该方法使用了一个高效的集中写操作把通过消息块的cont()指针连接在一起的所有消息块打印出来
	*/
	for (mblk = head; mblk != 0; mblk = mblk->cont())
	{
		ACE::write_n(ACE_STDOUT, mblk->rd_ptr(), mblk->length());
	}

	// 释放链表中的所有内存
	head->release();

	return 0;
};

原文地址:https://www.cnblogs.com/iapp/p/3631828.html