关于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。我该怎么做? 很简单,卷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 谢谢回复,但是我就是这么做的,可是没有用的,我没有看到发送出去! 1、跟踪代码,看看哪里出了问题。
2、你可能概念还没有理解透彻。发送的时候,只要OS缓冲区没有满,就可以一直发送,直到满了返回错误。在这种情况下,缓冲区再次空闲出来后,会调用handle_output.
页:
[1]