jisuanjixu 发表于 2008-6-7 13:07:23

关于handle_output

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。我该怎么做?

winston 发表于 2008-6-7 13:24:15

很简单,卷2上面有代码实例,给你copy过来:
// Listing 5 code/ch07
int Client::handle_output (ACE_HANDLE)
{
ACE_Message_Block *mb;
ACE_Time_Value nowait (ACE_OS::gettimeofday ());
while (-1 != this->getq (mb, &nowait))
    {
      ssize_t send_cnt =
      this->peer ().send (mb->rd_ptr (), mb->length ());
      if (send_cnt == -1)
      ACE_ERROR ((LM_ERROR,
                  ACE_TEXT ("(%P|%t) %p\n"),
                  ACE_TEXT ("send")));
      else
      mb->rd_ptr (static_cast<size_t> (send_cnt));
      if (mb->length () > 0)
      {
          this->ungetq (mb);
          break;
      }
      mb->release ();
    }
if (this->msg_queue ()->is_empty ())
    this->reactor ()->cancel_wakeup
      (this, ACE_Event_Handler::WRITE_MASK);
else
    this->reactor ()->schedule_wakeup
      (this, ACE_Event_Handler::WRITE_MASK);
return 0;
}
// Listing 5

jisuanjixu 发表于 2008-6-7 13:34:11

谢谢回复,但是我就是这么做的,可是没有用的,我没有看到发送出去!

winston 发表于 2008-6-7 16:25:54

1、跟踪代码,看看哪里出了问题。
2、你可能概念还没有理解透彻。发送的时候,只要OS缓冲区没有满,就可以一直发送,直到满了返回错误。在这种情况下,缓冲区再次空闲出来后,会调用handle_output.
页: [1]
查看完整版本: 关于handle_output