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); } }
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; }
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; }