我写了一个基于客户-服务器(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 )
------解决方案--------------------------------------------------------
检查一下其他地方的代码,也不一定是找个地方的问题。