現在、データグラム (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 などの高水準言語で可能ですか?