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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值