void AIO_Output_Handler::handle_write_stream
       (const ACE_Asynch_Write_Stream::Result &result) {
  ACE_Message_Block &mblk = result.message_block ();
  if (!result.success ()) {
    mblk.rd_ptr (mblk.base ());
    ungetq (&mblk);
  }
  else {
    can_write_ = handle () == result.handle ();
    if (mblk.length () == 0) {
      mblk.release ();
      if (can_write_) start_write ();
    }
    else if (can_write_) start_write (&mblk);
    else { mblk.rd_ptr (mblk.base ()); ungetq (&mblk); }
  }
}
void AIO_Output_Handler::start_write (ACE_Message_Block *mblk) {
  if (mblk == 0) {
    ACE_Time_Value nonblock (0);
    getq (mblk, &nonblock);
  }
  if (mblk != 0) {
    can_write_ = 0;
    if (writer_.write (*mblk, mblk->length ()) == -1)
      ungetq (mblk);
  }
}
Example #3
0
bool AuthLink::send_buffer()
{
    ssize_t send_cnt = m_peer.send(m_unsent_bytes_storage.read_ptr(), m_unsent_bytes_storage.GetReadableDataSize());
    if (send_cnt == -1)
        ACE_ERROR ((LM_ERROR,ACE_TEXT ("(%P|%t) %p\n"), ACE_TEXT ("send")));
    else
    {
        m_unsent_bytes_storage.PopFront(send_cnt); // this many bytes were sent
    }
    if (m_unsent_bytes_storage.GetReadableDataSize() > 0) // and still there is something left
    {
        ungetq(new ContinueEvent);
        return false; // couldn't send all
    }
    return true;
}
Example #4
0
int AceSockHdrBase::send(ACE_Message_Block* ack_msg /* = NULL */)
{
    if (ack_msg == NULL) // 内部事件触发时用 
    {
        if (this->msg_queue()->is_empty())
        {
            ACE_Reactor::instance()->cancel_wakeup(this, WRITE_MASK);
            return 0;
        }
        
        this->getq(ack_msg);
    }
    
    while (ack_msg)
    {
        ACE_DEBUG((LM_NOTICE, "[%D] AceSockHdrBase start to send len=%d,ack_msg=0x%08x\n", ack_msg->length(), ack_msg));
        //发送消息时确保设置非阻塞模式 timeout 才能用 NULL by xwfang 2010-01-22
        int ret = this->peer().send(ack_msg->rd_ptr(), ack_msg->length(), time_null_); 
        switch (ret)
        {
            case 0:
                // peer closed
                ACE_DEBUG((LM_ERROR, "[%D] AceSockHdrBase send failed"
                    ",connection closed by foreign host"
                    ",ret=%d"
                    ",ip=%s"
                    "\n"
                    , ret
                    , remote_addr_.get_host_addr()
                    ));
                ack_msg->release();
                ack_msg = NULL;
                Stat::instance()->incre_stat(STAT_CODE_ACK_DISCONN);
                return -1;
            case -1:
                if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINPROGRESS)
                {
                    ACE_DEBUG((LM_ERROR, "[%D] AceSockHdrBase send failed,ret=%d"
                        ",errno=%d,errmsg=%s,ip=%s\n"
                        , ret
                        , errno
                        , strerror(errno)
                        , remote_addr_.get_host_addr()
                        ));
				    
                    ack_msg->release();
                    ack_msg = NULL;
                    Stat::instance()->incre_stat(STAT_CODE_ACK_BLOCK);
                    return 0;
                }
                else
                {
                    // abnormal error
                    ACE_DEBUG((LM_ERROR, "[%D] AceSockHdrBase send failed,ret=%d"
                        ",errno=%d,errmsg=%s,ip=%s\n"
                        , ret
                        , errno
                        , strerror(errno)
                        , remote_addr_.get_host_addr()
                        ));
                    ack_msg->release();
                    ack_msg = NULL;
                    Stat::instance()->incre_stat(STAT_CODE_ACK_ABNOR);
                    return -1;
                }
            default:
                // normal case
                ack_msg->rd_ptr(ret);
                Stat::instance()->incre_stat(STAT_CODE_ACK_UNCOMP);
                break;
        }
        
        if (ack_msg->length() != 0)
        {
            ungetq(ack_msg);
            ACE_Reactor::instance()->schedule_wakeup(this, WRITE_MASK);
            break;
        }
        else
        {
            ACE_DEBUG((LM_NOTICE, "[%D] AceSockHdrBase send ack_msg=0x%08x succ\n", ack_msg));
            //正常发送完成,释放资源
            ack_msg->release();
            //delete ack_msg;
            ack_msg = NULL;
            
            if (this->msg_queue()->is_empty())
            {
                ACE_Reactor::instance()->cancel_wakeup(this, WRITE_MASK);
                break;
            }
            
            this->getq(ack_msg);
        }
    	
    }
    
    return 0;
}