字体:  

关于handle_output

jisuanjixu 发表于: 2008-6-07 13:07 来源: ACE 开发者

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 at 2008-6-07 13:24:15
很简单,卷2上面有代码实例,给你copy过来:

CODE:

// 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 at 2008-6-07 13:34:11
谢谢回复,但是我就是这么做的,可是没有用的,我没有看到发送出去!
winston at 2008-6-07 16:25:54
1、跟踪代码,看看哪里出了问题。
2、你可能概念还没有理解透彻。发送的时候,只要OS缓冲区没有满,就可以一直发送,直到满了返回错误。在这种情况下,缓冲区再次空闲出来后,会调用handle_output.