首先我们来看一下发送数据的函数的参数设置
int sendto (
SOCKET s, //套接字描述符
const char *buf, //要传输的数据
int len, //数据长度
int flags, //指定调用方式
const struct sockaddr *to, //目标套接字地址
int tolen ); //地址大小
这里我主要说一下,当发送的数据是一个结构体的向量时,我们应该如何发送数据。
typedef struct _stu_info
{
char name[9];
int num;
...
}Stu_Info;
vector<Stu_Info> Student;
假设我们在Student这个向量中存了很多组数据,现在我们要做的就是将Student中存放的数据同过sendto函数发送出去,下面是发送数据的代码。
sendto(m_SendSock, (char*)&Student[0], Student.size()*sizeof(Stu_Info), 0, (SOCKADDR*)&m_SendAddr, nAddrLen)
要传输的数据是char*类型的,这里我们把向量直接强制类型转换为char*,即(char*)&Student[0]。至此我们的数据发送成功。
数据发送成功了,接收端我们对数据也要做一个处理。
接收UDP数据的函数recvfrom
int recvfrom (
SOCKET s, //套接字描述符
char *buf, //传入数据的缓冲区
int len, //接收数据的长度
int flags, //指定调用方式
struct sockaddr *from, //接收套接字地址
int *fromlen ); //地址大小
接收数据的语句
count = recvfrom(m_RecvSock, buf, 1000, 0, (SOCKADDR*)&(m_RecvAddr), &nAddrLen)
对buf中的数据信息进行解析
vector<Stu_Info> resolveData;
Stu_Info* Student=new Stu_Info();
//计算解析多少组数据
int nCount=count/sizeof(Stu_Info); // 计算buf 中共有多少组数据
for(int i=0;i<nCount;i++)
{
memcpy(Student,buf+i*sizeof(Stu_Info),sizeof(Stu_Info));
resolveData.push_back(*Student);
}
以上就是对结构体向量数据的UDP发送和接收,以及解析接收的数据。