ACE_Task和ACE_Service_Handler的问题
Proactor模式,ACE_Service_Handler中接收完数据包后putq到ACE_Task并由其完成业务逻辑处理,现在的问题是怎么从ACE_Task中通过ACE_Service_Handler回包呢?已经把ACE_Service_Handler的实例句柄一起putq到ACE_Task,在ACE_Service_Handler的实例中提供一个SendData的方法,但在ACE_Task中通过getq得到的ACE_Service_Handler的实例句柄来调用的SendData时发生异常,不过数据已经传递过去(SendData的参数是ACE_Message_Block &),异常的错误信息是读取位置时内存冲突!
不知道这样的方法是否正确,还有就是为什么这样的方式会不能成功? 把实例指针进行转换,
进入Task前:
ACE_Message_Block * mb_blk_call = NULL;
ACE_NEW(mb_blk_call,ACE_Message_Block(ACE_reinterpret_cast(char* ,(CAsynchProcess *)this)));
Task处理时:
ACE_Message_Block * msg_pt = msg_blk->cont();
CAsynchProcess * msg_handler = ACE_reinterpret_cast(CAsynchProcess *,msg_pt->rd_ptr()); ACE_Service_Handler实例里面的部分代码及处理方式
定义了一个结构作为包头放在数据包前面,通过ACE_Message_Block连接起来
struct PacketHeader
{
CReceiveProcess *handler;
int packet_length;
};
开始接收前的处理,先往ACE_Message_Block中压入一个PacketHeader,并把ACE_Service_Handler的实例句柄放进去,注释掉的那句是我原来的写法
ACE_NEW_NORETURN (recv_data_, ACE_Message_Block (sizeof(PacketHeader), MB_NORMAL_PACKET));
this->recv_data_->copy (ACE_reinterpret_cast(char* ,(CReceiveProcess *)this), sizeof(this));
//this->recv_data_->copy ((const char *)(this), sizeof(this));
this->reader_.read (*recv_data_, recv_data_->space ());
用于ACE_Task调用的回包函数,异常就是发生在异步写的这一行
void CReceiveProcess ::send(ACE_Message_Block &mb)
{
if (this->write_.write (mb , mb.length() ) == -1)
{
mb.release ();
//ACE_ERROR (LM_ERROR, "%p\n", "ACE_Asynch_Write_File::write"), -1);
}
}
Task里面的处理,先得到PacketHeader,然后是具体的数据包,然后调用send发放进行回包
PacketHeader * hdr = reinterpret_cast<PacketHeader *> (message->rd_ptr ());
ACE_Message_Block * data_mb = message->cont();
CReceiveProcess * msg_handler = ACE_reinterpret_cast(CReceiveProcess *,hdr->handler);
msg_handler->send(*mbt);
mbt是我测试的数据,系统时间而已,代码如下
//向发送端发回系统时间
ACE_OS::sleep(1);
time_t now = ACE_OS::gettimeofday().sec();
char *time = ctime(&now); //获取当前时间的字符串格式
ACE_Message_Block *mbt = new ACE_Message_Block(100);
mbt->copy(time);
页:
[1]