udp通信中变长结构体的存在意义?

作者站长头像
站长
· 阅读数 22

Hello!.我定义了一个普通的变长结构体用于UDP通信,大概类似这样.

struct
{
    int size;
    char data[0];
}

然而我发现一个问题,我在接收方设置的函数是。

recvfrom(serverSocket, buffer, 30000, 0, (struct sockaddr *)&clientAddr, &clientAddrLen);

它会接受小于30000以下的消息,而我的通信长度是无论如何都不会大于30000的。那这里的变长结构体还有意义吗?我还想问一下当我在结构体的尾部使用char data[0]时会发生什么,谢谢。

回复
1个回答
avatar
test
2024-06-27

以你的代码示例讲讲,尽管你作为接收方,设置了接收缓冲区大小为30000,但实际上UDP协议本身并不保证完整性和可靠性,UDP包可能会在传输过程中被分片、丢失、重复或乱序到达。所以,即使你的通信长度不会超过30000,也不能保证每次接收到的UDP包的大小都完全等于发送方的数据长度。所以,用变长结构体可以使你的代码更加灵活,适应不同大小的数据。它允许你动态分配内存来存储实际接收到的数据,并避免了提前指定一个固定大小可能造成的内存浪费。有点近似于动态数组malloc函数和静态数组的理解。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容