找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3588|回复: 4

问:c++网络编程中ACE_Message_Block的示例

[复制链接]
发表于 2008-4-3 21:24:59 | 显示全部楼层 |阅读模式
C++网络编程 , page75 中的这个示例:
#include   "ace/ACE.h"
#include "ace/OS.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;
for(;;)
{
  ssize_t nbytes = ACE::read_n( ACE_STDIN, mblk->wr_ptr(), mblk->size() );
  if( nbytes <= 0 )
   break;  //break out at EOF or error.
  //Allocate message block and chain it at the end of list.
  mblk->cont( new ACE_Message_Block(BUFSIZ) );
  mblk = mblk->cont();
}
for( mblk = head; mblk != 0; mblk = mblk->cont() )
  ACE::write_n( ACE_STDOUT, mblk->rd_ptr(), mblk->length() );
head->release();  //This releases all the memory in the chain.
return 0;
}

这个程序怎么用啊.//break out at EOF or error.
程序怎么输入才能自己结束啊 . 别告诉我是 ctrl+Z,这个我知道. 但如果是这样的话怎么看结果呢.
发表于 2008-4-3 21:35:18 | 显示全部楼层
不懂你要干啥?...
 楼主| 发表于 2008-4-3 21:56:33 | 显示全部楼层
这个程序将标准输入设备中的所有数据读到一个单链表中; 单链表中是动态分配的ACE_Message_Blocks. 首先, 它们被“连接指针”串接在一起; 其次,这个程序会将所有已连接的消息块中的内容输出到标准输出设备中,并释放动态分配的内存。
  这是书上说的啊。
现在,运行程序后我输入数据,  但是结束不了输了。 程序中的提示是//break out at EOF or error.  或是怎么才能使输入让程序识别EOF呢。 不知道所以问大家。
其在结束不了输入就用了ctrl+z.  :L
发表于 2008-6-26 21:52:15 | 显示全部楼层
将ACE_STDIN改成文件句柄吧
发表于 2008-6-28 21:51:59 | 显示全部楼层
可以做如下修改:
不过要保证1.txt文件大于BUFSIZ,因为ACE::read_n函数的实现中对于小于BUFSIZ部分的内容无法读取,不知道这算不算一个bug。

#include   "ace/ACE.h"
#include "ace/OS.h"
#include "ace/Message_Block.h"
int main(int argc, char* argv[])
{
ACE_HANDLE hFile = open("/home/1.txt", O_RDONLY);
if (ACE_INVALID_HANDLE == hFile)
{
  perror("open file");
  return -1;
}

ACE_Message_Block* head = new ACE_Message_Block(BUFSIZ);
ACE_Message_Block* mblk = head;
for(;;)
{
  ssize_t nbytes = ACE::read_n(hFile/* ACE_STDIN*/, mblk->wr_ptr(), mblk->size() );
  if( nbytes <= 0 )
   break;  //break out at EOF or error.
  //Allocate message block and chain it at the end of list.
  mblk->cont( new ACE_Message_Block(BUFSIZ) );
  mblk = mblk->cont();
}
for( mblk = head; mblk != 0; mblk = mblk->cont() )
  ACE::write_n( ACE_STDOUT, mblk->rd_ptr(), mblk->length() );
head->release();  //This releases all the memory in the chain.
return 0;
}

[ 本帖最后由 cruel 于 2008-6-28 21:53 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 00:01 , Processed in 0.016501 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表