udp通信中变长结构体的存在意义?-灵析社区

刘一抗二二

Hello!. 我定义了一个普通的变长结构体用于UDP通信,大概类似这样. struct { int size; char data[0]; } 然而我发现一个问题,我在接收方设置的函数是。 recvfrom(serverSocket, buffer, 30000, 0, (struct sockaddr *)&clientAddr, &clientAddrLen); 它会接受小于30000以下的消息,而我的通信长度是无论如何都不会大于30000的。那这里的变长结构体还有意义吗? 我还想问一下当我在结构体的尾部使用`char data[0]`时会发生什么,谢谢。

阅读量:279

点赞量:19

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