I'm sending a C struct over UDP
struct packet{
int numInt;
int* intList; //malloc'ed as (sizeof(int)*numInt)
}
It will be serialized as [numInt][intList[0]]...[intList[numInt-1]]
.
My understanding is that calling recvfrom
on UDP will read the entire packet, even if the buffer doesn't hold that many bytes. Is using a really large buffer the only option I have?
You could pass MSG_PEEK
to recvfrom
to find out exactly how big the buffer needs to be. So just recvfrom
a few bytes with MSG_PEEK
to find numInt
and then recvfrom
the real thing (this time without MSG_PEEK
).
The standard says something about MSG_PEEK
, but kernel.org spells it better:
MSG_PEEK
This flag causes the receive operation to return data from the beginning of the receive queue without removing that data from the queue. Thus, a subsequent receive call will return the same data.
Obviously at some point you will start wondering if doubling the number of system calls to save memory is worth it. I think it isn't.