cserializationudp

How to read UDP packet with variable length in C


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?


Solution

  • 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.