关于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可用吗?
[解决办法]
还是用数组等来转换发送,同时指定大小