贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

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

jolly_w23 发表于: 2008-4-03 21:24 来源: ACE 开发者

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,这个我知道. 但如果是这样的话怎么看结果呢.

最新回复

peakzhang at 2008-4-03 21:35:18
不懂你要干啥?...
jolly_w23 at 2008-4-03 21:56:33
这个程序将标准输入设备中的所有数据读到一个单链表中; 单链表中是动态分配的ACE_Message_Blocks. 首先, 它们被“连接指针”串接在一起; 其次,这个程序会将所有已连接的消息块中的内容输出到标准输出设备中,并释放动态分配的内存。
  这是书上说的啊。
现在,运行程序后我输入数据,  但是结束不了输了。 程序中的提示是//break out at EOF or error.  或是怎么才能使输入让程序识别EOF呢。 不知道所以问大家。
其在结束不了输入就用了ctrl+z.  
cruel at 2008-6-26 21:52:15
将ACE_STDIN改成文件句柄吧
cruel at 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 编辑 ]