关于ACE_Svc_Handler
為什么list中的內(nèi)容在handle_output中取不出來(lái)呢?
類的聲明:
class MainTask :public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>
{
? ? ? ? typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH> super;
public:
? ? ? ? MainTask () : notifier_ (0, this, ACE_Event_Handler::WRITE_MASK)
? ? ? ? {}
? ? ? ? virtual int open (void * = 0);
? ? ? ? virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
? ? ? ? virtual int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE);
public:
? ?? ??// 在handle_input函數(shù)中向此列表中插入數(shù)據(jù),在handle_output函數(shù)中取出。
? ? ? ? std::vector<sFesRawDataReq*>? ? ? ? ? ? ? ? m_reqlist;
private:
? ? ? ? ACE_Reactor_Notification_Strategy? ? ? ? notifier_;
? ? ? ??
? ? ? ? ACE_Mutex? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_mutex;
};
//?handle_input在此函數(shù)中向m_reqlist中插入內(nèi)容。此處跟蹤沒(méi)有出問(wèn)題。
int MainTask::handle_input (ACE_HANDLE)
{
? ? ? ??
? ? ? ? char buf[21];
? ? ? ? // 接收主程序數(shù)據(jù)請(qǐng)求,并放入請(qǐng)求隊(duì)列:m_reqlist
? ? ? ? ssize_t recv_cnt = this->peer ().recv (buf, sizeof (buf) - 1);
? ? ? ? if (recv_cnt > 0)
? ? ? ? {
? ? ? ? ? ? ? ? buf[recv_cnt] = '\0';
? ? ? ? ? ? ? ? sFesRawDataReq *pdata = new sFesRawDataReq;
? ? ? ? ? ? ? ? pdata = (sFesRawDataReq*)buf;
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? // 操作之前先鎖定
? ? ? ? ? ? ? ? m_mutex.acquire();
? ? ? ? ? ? ? ? // 檢查請(qǐng)求列表,始終只維持一個(gè)IP的一個(gè)請(qǐng)求。如果有重復(fù)IP,則刪除前一個(gè)請(qǐng)求。
? ? ? ? ? ? ? ? std::vector<sFesRawDataReq*>::iterator iter =m_reqlist.begin();
? ? ? ? ? ? ? ? int flag = 0;
? ? ? ? ? ? ? ? for (iter;iter != m_reqlist.end();iter++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? sFesRawDataReq *ptemp = (*iter);
? ? ? ? ? ? ? ? ? ? ? ? if (ACE_OS::strncmp(ptemp->ip,pdata->ip,ACE_OS::strlen(pdata->ip)) == 0)
? ? ? ? ? ? ? ? ? ? ? ? {? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_reqlist.erase(iter);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? iter = m_reqlist.begin();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_reqlist.push_back(pdata);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? flag = 1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? // 此請(qǐng)求為新請(qǐng)求,放入隊(duì)列。
? ? ? ? ? ? ? ? if (flag == 0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? m_reqlist.push_back(pdata);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 釋放鎖
? ? ? ? ? ? ? ? m_mutex.release();
? ? ? ? ? ? ? ? return 0;
? ? ? ? }
? ? ? ??
? ? ? ? return 0;
}
// 取m_reqlist中的內(nèi)容。但是取出的是亂碼。
int MainTask::handle_output (ACE_HANDLE)
{
? ? ? ??
? ? ? ? ACE_Message_Block *mb;
? ? ? ? ACE_Time_Value nowait (ACE_OS::gettimeofday ());
? ? ? ? while (-1 != this->getq (mb, &nowait))
? ? ? ? {
? ? ? ? ? ? ? ? // 消息內(nèi)容長(zhǎng)度
? ? ? ? ? ? ? ? size_t len = mb->length();
? ? ? ? ? ? ? ? // 消息塊內(nèi)容
? ? ? ? ? ? ? ? char *buff = mb->rd_ptr();
? ? ? ? ? ? ? ? sFesRawDataInfo *pdata = (sFesRawDataInfo*)buff;
? ? ? ? ? ? ? ? std::vector<sFesRawDataReq*>::iterator iter = m_reqlist.begin();
? ? ? ? ? ? ? ? // 讀取請(qǐng)求之前先鎖定
? ? ? ? ? ? ? ? m_mutex.acquire();
? ? ? ? ? ? ? ? //判斷此次讀取的記錄是否為主程序請(qǐng)求數(shù)據(jù),如果是,則發(fā)送給主程序。
? ? ? ? ? ? ? ? for (iter;iter != m_reqlist.end();iter++)
? ? ? ? ? ? ? ? {
//?此處顯示取出的是亂碼
? ? ? ? ? ? ? ? ? ? ? ? sFesRawDataReq* preq = (sFesRawDataReq*)*iter;
? ? ? ? ? ? ? ? ? ? ? ? if (preq->id == pdata->id)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? size_t send_cnt = this->peer ().send (mb->rd_ptr(), len);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (send_cnt == -1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ACE_ERROR ((LM_ERROR,ACE_TEXT ("(%P|%t) %p\n"),ACE_TEXT ("send")));
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 更新消息塊讀指針
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mb->rd_ptr (ACE_static_cast (size_t, send_cnt));
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mb->release ();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 釋放鎖
? ? ? ? ? ? ? ? m_mutex.release();
? ? ? ? }
? ? ? ??
? ? ? ? return 0;
}
總結(jié)
以上是生活随笔為你收集整理的关于ACE_Svc_Handler的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ACE中的Proactor介绍和应用实例
- 下一篇: IO设计模式:Reactor和Proac