首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于vector 类型的数据发送有关问题

2012-02-02 
关于vector类型的数据发送问题我自定义的结构体typedef struct _tagMemberInfo{char chID[10]int nNum}M

关于vector 类型的数据发送问题
我自定义的结构体
typedef struct _tagMemberInfo
{
char chID[10];
int nNum;
}MemberInfo, *LPMemberInfo;

typedef struct _tagMyStruct
{
char chMeetingID[20];
vector<MemberInfo> vtMember;
}MyStruct, *LPMyStruct;

定义了变量 LPMyStruct lpData = new MyStruct;

有一个网络数据发送的函数 int SendData(char *data,unsigned int uiDataLen);

初始化:
strcpy_s(lpData->chMeetingID,20,"MeetingOne");

MemberInfo mInfo;
strcpy_s(mInfo.chID,10,"one");
mInfo.nNum = 1;

lpData->vtMember.push_back(mInfo);

strcpy_s(mInfo.chID,10,"two");
mInfo.nNum = 2;

lpData->vtMember.push_back(mInfo);

strcpy_s(mInfo.chID,10,"three");
mInfo.nNum = 3;

lpData->vtMember.push_back(mInfo);


然后:
SendData((char*)lpData,sizeof(MyStruct)+sizeof(MemberInfo)*(lpData->vtMember.size()));


这样子应该是不行的吧!!!


因为有不定数量的lpData->vtMember 数量不定 所以 这改怎么发送数据 使用数组吗

[解决办法]
typedef struct _tagMyStruct
{
char chMeetingID[20];
vector<MemberInfo> vtMember;
}MyStruct, *LPMyStruct;
这样定义这个结构体做为数据包是不行的,因为send(sock,&MyStruct,sizeof(MyStruct))是把MyStruct结构体变量所对应的内存数据(这段内存是连续的)拷贝到sock缓冲区,然后发送出去,所以,你要发送的数据,必须全部在结构体的内存中,不能是指针指向的数据,像下面的定义
struct Test
{
 char *ptr;
};
这样并不会把ptr指向的内存数据发送出去,而是把ptr发送出去。
因此你的vector,他的内部是用一个动态数组实现,数据是一个在堆上的连续内存数组,并不被包含在结构体内,所以,无法发送出去。
因此,数据部分,一般用数组实现,你也可是试一下“柔性数组”
[解决办法]
vector<MemberInfo> vtMember;

这样肯定不行,因为vtMember的地址不同于其中数据的地址,这样发送过去了,也不会是正确的数据。

不是有safearray可用吗?
[解决办法]
还是用数组等来转换发送,同时指定大小

热点排行