在UDP通信中,使用变长结构体(又称为灵活数组成员)的存在意义是为了在不固定大小的数据报中传输可变长度的数据。


在你的示例中,结构体定义了一个变长结构体,其中包含一个整型变量 `size` 和一个大小为0的字符数组 `data`。通过将字符数组大小设置为0,你可以根据实际数据的长度在运行时分配足够的空间。


对于你的问题,接收方的 `recvfrom` 函数设置了缓冲区大小为30000字节,但实际接收到的UDP数据报可能小于该大小。这是因为UDP是无连接的协议,数据报的大小可能被网络相关因素(如MTU)限制,并且在传输过程中可能会发生数据分片或丢失。


至于你在结构体尾部使用 `char data[0]`,实际上这是一种常见的技巧,可以用于在不知道数据大小的情况下动态分配内存。在接收到数据时,你可以使用接收到的 `size` 值作为动态分配内存的依据,然后将接收到的数据存储在动态分配的内存中。


需要注意的是,C99标准中引入了灵活数组成员的概念,但在C11标准中被废弃。因此,为了更好的可移植性和可维护性,建议使用动态分配内存的方式,而不是依赖于灵活数组成员。


总而言之,使用变长结构体可以在UDP通信中传输可变长度的数据,但需要注意UDP数据报的大小限制,并且要谨慎使用变长结构体以避免潜在的问题。