当前位置: 代码迷 >> Symbian >> 堆和栈的生存期有关问题(C/S模式通信中)
  详细解决方案

堆和栈的生存期有关问题(C/S模式通信中)

热度:6445   发布时间:2013-02-26 00:00:00.0
堆和栈的生存期问题(C/S模式通信中)

我写了一个基于客户-服务器(C/S)模式的应用程序(并非网络通信的)。其主要功能是:服务器运行在后台(EXE),客户运行在前台(APP)。客户向服务器提出请求,然后服务器把处理好的数据传送到客户端。在模拟器上可以正常运行,没有任何问题,能够达到预期效果。但是,一放到手机上就出大问题:首先,客户可以向服务器发送消息,可以也可以收到服务器响应的消息,但是一旦进行数据通信的时候,即用RMessage写回数据的时候就异常退出。
客户-服务器通信部分代码:
//aStateMsg和imsg都是自定义的结构体(TStateMsg)类型,里头是4个TINT型数据。
//CLIENT
iStateBuffer.Set(   reinterpret_cast <TUint8*> (   &aStateMsg   ),   sizeof(   aStateMsg   ),
sizeof(   aStateMsg   )   );
messageParameters[0]   =   static_cast <TAny*> (   &iStateBuffer   );
  SendReceive(   ERequstState,   &messageParameters[0],   aStatus   );

//SERVER
TPtr8   ptr(   reinterpret_cast <TUint8*> (   &imsg   ),   sizeof(   imsg   ),
sizeof(   imsg   )   );


TRAPD(err,   iMessage.WriteL(iMessage.Ptr0(),ptr));
if(err)
{

PanicClient(EBadDescriptor);

}
iMessage.Complete(ERequestComplete);
后来看《高效编程》上面说,传递给异步请求的客户端数据必须不是基于栈的,于是我将客户端代码修

改如下:

HBufC8*   hbuf   =   HBufC8::NewLC(sizeof(aStateMsg));
TPtr8   ptr   =   hbuf-> Des();
messageParameters[0]   =   static_cast <TAny*> (&ptr);
这下在模拟器上也无法运行了(编译可以通过),也是到了写回数据的时候就异常退出。不知道基于堆的数据传递是不是我上面的写法?请高人指点了。
还有,我最后干脆把异步模式改为同步模式了,在模拟器上运行正常,放到手机上同样是异常退出。
这下子我真的没辙了,同步、异步都不行,难道这种IPC方式在手机上不可用?有人知道吗?

------解决方案--------------------------------------------------------

HBufC8* hbuf = HBufC8::NewLC(sizeof(aStateMsg));

TPtr8 ptr = hbuf-> Des();
messageParameters[0] = static_cast <TAny*> (&ptr); //这个你传的是栈变量


你要么传HBufC8*进去,要么传raw data buffer + size 进去。但这都取决于服务器怎么解释传进去的数据.


HBufC8* hbuf = HBufC8::NewLC(sizeof(aStateMsg));
messageParameters[0] = static_cast <TAny*> (hbuf-> Des().Ptr());

messageParameters[1] = sizeof(aStateMsg);



messageParameters[0] = static_cast <TAny*> (hbuf )

------解决方案--------------------------------------------------------
检查一下其他地方的代码,也不一定是找个地方的问题。
  相关解决方案