我正在通过UDP发送C结构
struct packet{ int numInt; int* intList; //malloc'ed as (sizeof(int)*numInt) }
它将序列化为[numInt][intList[0]]...[intList[numInt-1]]
。
我的理解是recvfrom
,即使缓冲区不包含那么多字节,调用UDP也会读取整个数据包。使用唯一的大缓冲区是我唯一的选择吗?
你可以传递MSG_PEEK
到recvfrom
找出究竟缓冲多大需要是。因此,仅需查找recvfrom
几个字节,然后再MSG_PEEK
查找真实的对象(这次没有)。numInt
recvfrom
MSG_PEEK
该标准说了一些有关的内容MSG_PEEK
,但kernel.org的拼写更好:
MSG_PEEK
此标志使接收操作从接收队列的开头返回数据,而不会从队列中删除该数据。因此,后续的接收呼叫将返回相同的数据。
显然,在某个时候,您会开始怀疑,将系统调用数量增加一倍以节省内存是否值得。我认为不是。