在recvfrom()之前获取udp中的消息长度

时间:2011-09-16 17:38:00

标签: udp message

我正在使用C编写Linux应用程序,它将收到数千条可能大小不一的UDP消息。不知何故,我必须获取消息大小,然后使用recvfrom()syscall将其读入缓冲区。我不能为最大可能的消息分配内存,因为因为我使用9,000的MTU并获得数千条消息,所以浪费了大量内存。 我在谷歌检查过,有可能找到带有SOTNREAD选项的消息大小为getsockopt系统调用,但这只适用于BSD。我知道消息位于Linux内核的某个地方,因为我的套接字工作在非阻塞模式,并且我被内核事件通知数据可用,因此,它必须存储消息长度,但我怎么能得到它?

提前致谢

1 个答案:

答案 0 :(得分:4)

您可能希望将ioctlFIONREAD一起使用。它适用于LinuxBSD

FIONREAD int获取可立即读取的字节数。

if(ioctl(s, FIONREAD, &bytes) != -1)
    printf("%d bytes available", bytes);