我必须通过udp套接字在两台机器之间发送一个结构 我需要的信息是发送如下结构:
unsigned long x;
unsigned long y;
char *buf;
我必须一次发送结构。
我的问题是:如何处理这个结构,例如,设置一个我可以通过套接字发送的变量,特别是因为变量buf的大小没有修复
感谢您的帮助
答案 0 :(得分:2)
你不能发送指针,在你的进程空间之外没有任何意义。相反,您必须序列化它,即复制到数组并发送它。在字符串之前,您还需要存储其长度。你可以尝试:
char sendbuf[...];
int len = strlen(buf);
memcpy(sendbuf, &x, sizeof(x));
memcpy(sendbuf + sizeof(x), &y, sizeof(y));
memcpy(sendbuf + ..., &len, sizeof(len));
memcpy(sendbuf + ..., buf, len);
答案 1 :(得分:1)
您需要将结构中的所有内容按顺序复制到单独的char缓冲区中,然后将其写入套接字。可选地,因为结构中的char *缓冲区不是固定长度,所以通常最好计算要发送的内容的大小,并在消息开头将其写为整数,以便在另一端您发送的数据包的长度可以通过接收套接字进行验证。
在另一端解压缩数据时,只需从接收缓冲区的开头开始,然后将数据存储到值中
char * message; //这是指向你的开始的指针 //收到消息缓冲区
// TODO: assign message to point at start of your received buffer.
unsigned long xx;
unsigned long yy;
memcpy(&xx,message,sizeof(unsigned long)); // copy bytes of message to xx
message += sizeof(unsigned long); // move pointer to where yy SHOULD BE
// within your packet
memcpy(&yy,nessage,sizeof(unsigned long)); // copy bytes to yy
message += sizeof(unsigned long); // message now points to start of
// the string part of your message
int iStringLength = // ?????? You need to calculate length of the string
char tempBuffer[1000]; // create a temp buffer this is just for illustration
// as 1000 may not be large enough - depends on how long
// the string is
memcpy(tempBuffer,message,iStringLength);
然后xx,yy包含你的长值,tempBuffer包含字符串。如果您希望字符串超出当前范围,那么您将需要分配一些内存并将其复制到那里。您可以根据整个邮件的大小减去2个未签名的长项目的大小来计算此字符串的大小(或者如上所述,使用您在数据包中发送的额外项目)。
我希望这能澄清你需要做什么