读书人

symbian Socket 有底组的结构 传输

发布时间: 2012-12-28 10:29:04 作者: rapoo

symbian Socket 有数组的结构 传输
传输数据结构为:

struct CMD_GP_Logon
{
TInt username;
TInt pwd;
};


客户端:
//创建数据
CMD_GP_Logon gpInfo;
gpInfo.username = 123456;
gpInfo.pwd = 856001;

//传输数据
TInt size = sizeof(gpInfo);
result = m_UserLogon->SendData(gpInfo, size);

SendData方法
//数据转换
TPtr8 ptr(REINTERPRET_CAST(TUint8*,&gpInfo), size);
//发送数据
iEngine->WriteL(ptr);

服务端:

public struct CMD_GP_Logon
{
public int dwPlazaVersion;
public int username;
public int pwd;
};

Socket接受的数据 保存在 pBuffer中
//数据转换
CMD_GP_Logon GpLogon = (CMD_GP_Logon)SocketStruct.BytesToStuct(pBuffer, typeof(CMD_GP_Logon));

这样是成功的.. 可以正确传递接受
但如果结构 中有数组
struct CMD_GP_Logon
{
Byte szAccounts[NAME_LEN];
Byte szPassWord[PASS_LEN];
};


TBuf<NAME_LEN> userName = iLoginContainer->GetUserName();
TBuf<PASS_LEN> pwd = iLoginContainer->GetPwd();

CMD_GP_Logon gpInfo;
memcpy(gpInfo.szAccounts, &userName, CountArray(gpInfo.szAccounts));
memcpy(gpInfo.szPassWord, &pwd, CountArray(gpInfo.szPassWord));

//传输数据
TInt size = sizeof(gpInfo);
result = m_UserLogon->SendData(gpInfo, size);

SendData方法
//数据转换
TPtr8 ptr(REINTERPRET_CAST(TUint8*,&gpInfo), size);
//发送数据
iEngine->WriteL(ptr);

服务端:
public struct CMD_GP_Logon
{
public int dwPlazaVersion;
public string szAccounts;
public string szPassWord;
};

Socket接受的数据 保存在 pBuffer中
//数据转换
CMD_GP_Logon GpLogon = (CMD_GP_Logon)SocketStruct.BytesToStuct(pBuffer, typeof(CMD_GP_Logon));

这行报错 错误为 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。服务端这边为何转换失败? 数据接受没问题。

[解决办法]
给服务端数据结构填写相同的值,调用SocketStruct.StructToBytes生成的值与客户端接收到的内容做比对,看是否相符
[解决办法]
谢谢楼上的朋友指点,不过这种方法还是无法测试准确。
[解决办法]
我的意思是,如果二者不能匹配的话,说明数据编排有问题。其实,你自己定义一个数据编排规则,只要客户端、服务端都遵守就行。
[解决办法]
这就是协议
网络数据就是一长串,
怎么解析就是协议。

读书人网 >Symbian

热点推荐