我正在通过udp发送一个c结构

struct packet{
    int numInt;
    int* intList; //malloc'ed as (sizeof(int)*numInt)
}

它将被序列化为[numInt][intList[0]]...[intList[numInt-1]]
我的理解是,在udp上调用recvfrom将读取整个数据包,即使缓冲区不包含那么多字节。使用一个非常大的缓冲区是我唯一的选择吗?

最佳答案

您可以将MSG_PEEK传递到recvfrom以确定缓冲区到底需要多大。所以只要用recvfrom几个字节就可以找到MSG_PEEK然后找到numInt真正的东西(这次没有recvfrom)。
The standard说了一些关于MSG_PEEK的东西,但是kernel.org拼写得更好:
MSG_PEEK
此标志使接收操作从
接收队列的开头,而不从
排队。因此,后续的接收调用将返回相同的数据。
显然,在某个时候,您会开始怀疑,将系统调用的次数加倍以节省内存是否值得。我想不是。

09-06 09:31