我正在通过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
此标志使接收操作从
接收队列的开头,而不从
排队。因此,后续的接收调用将返回相同的数据。
显然,在某个时候,您会开始怀疑,将系统调用的次数加倍以节省内存是否值得。我想不是。