我目前正在尝试将处理数据报(udp)数据包的 ac 程序移植到一些更高级别的语言。由于数据包可以是可变大小的,它们以一个整数开始,说明它们的大小。在 c 中,我使用 MSG_PEEK 标志调用 recv 以首先仅接收此值,然后分配一个合适的缓冲区并读取数据包的其余部分。代码(简化)如下所示:
// Simplified message format.
struct message {
int length;
char[] text;
}
struct message *m = malloc (sizeof(int));
// Read out in just length.
recv (sock, m, sizeof(int), MSG_WAITALL | MSG_PEEK);
int txtlen = ntohl (m->length) * sizeof(char);
int msglen = sizeof(int) + txtlen;
// Read complete packet.
m = realloc (m, msglen);
read (sock, m, msglen);
m->text[txtlen] = '\0';
// Show result.
printf("%s\n", &m->text);
我想避免看似普遍的做法来分配一个巨大的缓冲区,并希望不会有更大的数据包到达。那么在 python 或 java 等高级语言中,是否可以预先查看数据报或确定其完整长度?