为什么list中的内容在handle_output中取不出来呢?
类的声明: class MainTask :public ACE_Svc_Handler { typedef ACE_Svc_Handler 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 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::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::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; }
问题解决了。原因是没有把数据从接收缓冲区拷贝出来。