我声明一个继承至 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;
}

问题解决了。原因是没有把数据从接收缓冲区拷贝出来。

关于ACE_Svc_Handler相关推荐

  1. ACE的接受器(Acceptor)和连接器(Connector):连接建立模式

    接受器 / 连接器模式设计用于降低连接建立与连接建立后所执行的服务之间的耦合.例如,在 WWW 浏览器中,所执行的服务或"实际工作"是解析和显示客户浏览器接收到的 HTML 页面. ...

  2. ACE_Service_Handler类的理解和使用

    CE_Service_Handler和ACE_Svc_Handler是类似的,不同的是使用在proactor中. ACE_Service_Handler类从代码的接口中直接可以看到很多相关的回调,例如 ...

  3. TCP 端口监听队列原理

    近期需要实现一个TCP线程池服务,该服务需要能够在同一个端口上实现 TCP 常规服务.HTTP请求服务.SOAP WebService 服务,为了测试 ACE 的线程池启动后,如果所有线程都在忙,客户 ...

  4. 魔兽私服Trinitycore架构设计分析之一

    这几天有些空闲时间,把改编自MangOS的魔兽私服Trinitycore代码梳理一下,也给有这方面兴趣 的童鞋一个交流空间,可能会连载15篇左右,大家慢慢看 首先把整体架构网络层说一下 打开整个工程, ...

  5. ACE的框架及其核心

    ACE设计框架和基础模块的关联 *一.案例描述 视频电警开发,是基于ACE框架上的一次重复开发,本文档拟对ACE框架做一个梳理,以期对他人进行基于ace的开发有所帮助. *二.系统安装 ACE的安装是 ...

  6. Boost.Asio,libevent和ACE之间关于Socket编程的比较(★firecat推荐★)

    文章来源:http://blog.163.com/miky_sun/blog/static/3369405201041753652505/ ACE官网 http://download.dre.vand ...

  7. ACE网络编程 --ACE库入门:中篇-ACE程序员教程

    ACE库下载地址:http://ace.ece.uci.edu/ 或 http://www.riverace.com ACE: Adaptive Communication Environment 自 ...

  8. 一个程序员的Java和C++学习之路(整理)

    转载:http://blog.csdn.net/ajian005/article/details/8003655 Java学习之路 一直有这么个想法,列一下我个人认为在学习和使用Java过程中可以推荐 ...

  9. 【转】一个程序员的Java和C++学习之路(整理)

    经典编程书籍大全:  http://blog.jobbole.com/106093/  https://github.com/jobbole/awesome-programming-books Jav ...

最新文章

  1. String为什么是不可变类型?
  2. python中set和dict类型_python从菜鸟到小仙的成长之路-----Dict和Set类型篇
  3. JUC锁-LockSupport(四)
  4. with grant option mysql_mysql用户及权限(WITH GRANT OPTION)
  5. mac地址规范及算法
  6. chart控件做实时曲线显示_「Qt」利用QChart实现实时动态的曲线数据展示(进化版)
  7. 关于RTB实时竞价的基本原理
  8. codeigniter index.php,CodeIgniter如何隐藏index.php | 学步园
  9. 中心极限定理_中心极限定理的的原理与应用
  10. Scala基础-01-Scala环境安装及基础语法(变量,函数)
  11. paip.信用卡账单处理系统功能vO22
  12. python使用密钥加密的表述_python - PythonGnuPG生成密钥,对消息进行加密和解密 - SO中文参考 - www.soinside.com...
  13. c语言软件下载与配置
  14. EditPlus3.3 集成 SVN
  15. 晶晨线刷工具_Amlogic_USB_Burning_Tool _刷机工具分享
  16. 微型计算机系统有三类总线它们是,《微机原理、汇编语言与接口技术》韩晓茹(习题解答全套...
  17. aligned_alloc
  18. 如何提高Windows 系统性能
  19. 推流拉流RMTP方案:Nginx+ffmpeg/obs+vlc/h5
  20. 如何再html5中嵌入视频网站视频

热门文章

  1. cocosc++怎么打印_Lua调用C++时打印堆栈信息
  2. drtek收音机使用说明_一百年前的便携式矿石收音机长啥样?这台1919年产品给你答案...
  3. 2012matlab aerospace,Matlab 2012安装图解
  4. php怎么新建页面,whmcs创建自定义页面,创建PHP访问页面方法
  5. 第四天2017/03/31(上午:指针、数组的小知识)
  6. 【自动驾驶】27.相机畸变_相机内参标定 整理
  7. 【自动驾驶】相机标定 疑问总结
  8. windows上安装Anaconda和python
  9. Fast-RCNN解析:训练阶段代码导读
  10. 阿里GTS解密--GTS的原理、架构与特点