找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6068|回复: 3

关于handle_output

[复制链接]
发表于 2008-6-7 13:07:23 | 显示全部楼层 |阅读模式
handle_input很好理解,当socket可写时即调用。在select_reator中当socket可写时会回调handle_output,在ACE_WFMO_Reactor中,当socket从不可写变成可写状态时会回调。这样的话每次客户端发送数据时,就会先回调handle_output,紧接着它就会回调handle_input。handle_input的回调机制符合我的应用,而对于handle_output,我想通过ace_message_queue中有数据putq时,通知回调handle_output。我该怎么做?
发表于 2008-6-7 13:24:15 | 显示全部楼层
很简单,卷2上面有代码实例,给你copy过来:
  1. // Listing 5 code/ch07
  2. int Client::handle_output (ACE_HANDLE)
  3. {
  4.   ACE_Message_Block *mb;
  5.   ACE_Time_Value nowait (ACE_OS::gettimeofday ());
  6.   while (-1 != this->getq (mb, &nowait))
  7.     {
  8.       ssize_t send_cnt =
  9.         this->peer ().send (mb->rd_ptr (), mb->length ());
  10.       if (send_cnt == -1)
  11.         ACE_ERROR ((LM_ERROR,
  12.                     ACE_TEXT ("(%P|%t) %p\n"),
  13.                     ACE_TEXT ("send")));
  14.       else
  15.         mb->rd_ptr (static_cast<size_t> (send_cnt));
  16.       if (mb->length () > 0)
  17.         {
  18.           this->ungetq (mb);
  19.           break;
  20.         }
  21.       mb->release ();
  22.     }
  23.   if (this->msg_queue ()->is_empty ())
  24.     this->reactor ()->cancel_wakeup
  25.       (this, ACE_Event_Handler::WRITE_MASK);
  26.   else
  27.     this->reactor ()->schedule_wakeup
  28.       (this, ACE_Event_Handler::WRITE_MASK);
  29.   return 0;
  30. }
  31. // Listing 5
复制代码
 楼主| 发表于 2008-6-7 13:34:11 | 显示全部楼层
谢谢回复,但是我就是这么做的,可是没有用的,我没有看到发送出去!
发表于 2008-6-7 16:25:54 | 显示全部楼层
1、跟踪代码,看看哪里出了问题。
2、你可能概念还没有理解透彻。发送的时候,只要OS缓冲区没有满,就可以一直发送,直到满了返回错误。在这种情况下,缓冲区再次空闲出来后,会调用handle_output.
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 01:56 , Processed in 0.013924 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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