peakzhang 发表于 2008-7-13 23:13:54

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 &),异常的错误信息是读取位置时内存冲突!
不知道这样的方法是否正确,还有就是为什么这样的方式会不能成功?

peakzhang 发表于 2008-7-13 23:14:01

把实例指针进行转换,
进入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());

peakzhang 发表于 2008-7-13 23:14:16

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]
查看完整版本: ACE_Task和ACE_Service_Handler的问题