关于ACE_Svc_Handler
来源:互联网 发布:矩阵和行列式的转换 编辑:程序博客网 时间:2024/05/16 09:35
为什么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
- 关于ACE_Svc_Handler
- ACE_Svc_Handler
- 转ACE_Svc_Handler
- 7.2 The ACE_Svc_Handler Class
- ACE_Svc_Handler 通信原理
- ACE_Svc_Handler与ACE_Event_Handler
- 小技巧: ACE_Svc_Handler的初始化
- ACE_Svc_Handler 通信原理(转)
- 小技巧: 当ACE_Svc_Handler关闭时使用的默认行为
- ace 实现的线程池,可以用ACE_Svc_Handler作为工作者
- ace 实现的线程池,可以用ACE_Task_Base,ACE_Task,ACE_Svc_Handler作为工作者
- ace 实现的线程池,可以用ACE_Task_Base,ACE_Task,ACE_Svc_Handler作为工作者
- 关于
- 关于
- 关于++,--
- 关于#
- 关于。。。
- ACE中的Proactor介绍和应用实例
- spring in action书中5.3节中代码错误
- Git 初接触 (三) Git的撤销操作 git checkout -- <file>
- JDBC
- MySQL添加用户、删除用户与授权 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL:
- 关于ACE_Svc_Handler
- servlet-会话
- 常见的数据库优化策略(经典)
- VS2010编译C++项目error LNK1123错误解决办法
- Codeforces Round #453 (Div. 2)A,B,C
- 性别特么有这么重要么
- java--URL编码和解码
- 899B
- linux开机启动mongodb