如何在C中读取长度可变的UDP数据包

Wei*_*Shi 3 c serialization udp

我正在通过UDP发送C结构

struct packet{
    int numInt;
    int* intList; //malloc'ed as (sizeof(int)*numInt)
}
Run Code Online (Sandbox Code Playgroud)

它将序列化为[numInt][intList[0]]...[intList[numInt-1]]

我的理解是recvfrom,即使缓冲区不包含那么多字节,调用UDP也会读取整个数据包。使用唯一的大缓冲区是我唯一的选择吗?

cni*_*tar 5

你可以传递MSG_PEEKrecvfrom找出究竟缓冲多大需要是。因此,仅需查找recvfrom几个字节,然后再MSG_PEEK查找真实的对象(这次没有)。numIntrecvfromMSG_PEEK

该标准说了一些有关的内容MSG_PEEK,但kernel.org的拼写更好:

MSG_PEEK

此标志使接收操作从接收队列的开头返回数据,而不会从队列中删除该数据。因此,后续的接收呼叫将返回相同的数据。

显然,在某个时候,您会开始怀疑,将系统调用数量增加一倍以节省内存是否值得。我认为不是。