0

我必须通过 udp 套接字在两台机器之间发送一个结构,我需要的信息是发送一个结构,如下所示:

unsigned long x;

unsigned long y;

char *buf;

我必须一次性发送结构。

我的问题是:我如何处理这个结构,例如,设置一个我可以通过套接字发送的变量,特别是变量 buf 的大小不固定

感谢您的帮助

4

2 回答 2

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);
于 2012-07-05T09:39:22.300 回答
1

您需要将结构中的所有内容按顺序复制到单独的字符缓冲区中,然后将其写入套接字。(可选)由于结构中的 char* 缓冲区不是固定长度的,因此计算要发送的内容的大小并在消息开头将其写为整数通常是一个好主意,以便在另一端您发送的数据包的长度可以通过您的接收套接字进行验证。

在另一端解包数据时,只需从接收缓冲区的开头开始,然后将 memcpy 数据放入您的值中

字符*消息;// 这是指向您接收到的消息缓冲区开始的指针

// 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 包含您的 long 值, tempBuffer 包含字符串。如果您希望字符串在当前范围之外持续存在,那么您需要分配一些内存并将其复制到那里。您可以从整个消息的大小减去 2 个无符号长项的大小来计算此字符串的大小(或者,如果您按照我上面的建议进行操作,则使用数据包中发送的额外项目)。

我希望这能澄清你需要做什么

于 2012-07-05T09:46:07.633 回答