關於ACE_Svc_Handler

我聲明一個繼承至ACE_Svc_Handler的類:mainTask.其中有成員變量:std:vector<T> list;我在回調handle_input中向list中放入內容,在handle_output中從list中取,但是在handle_input中是放入成功了,但是在handle_output中取的時候,發現list中是有內容,但是內容不正確。不是在huandle_input時候放入的內容。

爲什麼list中的內容在handle_output中取不出來呢?


類的聲明:
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函數中向此列表中插入數據,在handle_output函數中取出。
        std::vector<sFesRawDataReq*>                m_reqlist;

private:

        ACE_Reactor_Notification_Strategy        notifier_;
        
        ACE_Mutex                                                        m_mutex;
};

// handle_input在此函數中向m_reqlist中插入內容。此處跟蹤沒有出問題。
int MainTask::handle_input (ACE_HANDLE)
{
        
        char buf[21];
        // 接收主程序數據請求,並放入請求隊列: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();
                // 檢查請求列表,始終只維持一個IP的一個請求。如果有重複IP,則刪除前一個請求。
                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;
                                
                        }
                        
                }
                
                // 此請求爲新請求,放入隊列。
                if (flag == 0)
                {
                        m_reqlist.push_back(pdata);
                }
                // 釋放鎖
                m_mutex.release();
                return 0;
        }
        
        return 0;
}
// 取m_reqlist中的內容。但是取出的是亂碼。
int MainTask::handle_output (ACE_HANDLE)
{
        
        ACE_Message_Block *mb;

        ACE_Time_Value nowait (ACE_OS::gettimeofday ());
        while (-1 != this->getq (mb, &nowait))
        {
                // 消息內容長度
                size_t len = mb->length();

                // 消息塊內容
                char *buff = mb->rd_ptr();
                sFesRawDataInfo *pdata = (sFesRawDataInfo*)buff;

                std::vector<sFesRawDataReq*>::iterator iter = m_reqlist.begin();
                // 讀取請求之前先鎖定
                m_mutex.acquire();

                //判斷此次讀取的記錄是否爲主程序請求數據,如果是,則發送給主程序。
                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;
}



問題解決了。原因是沒有把數據從接收緩衝區拷貝出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章