我正在使用C编写Linux应用程序,它将收到数千条可能大小不一的UDP消息。不知何故,我必须获取消息大小,然后使用recvfrom()syscall将其读入缓冲区。我不能为最大可能的消息分配内存,因为因为我使用9,000的MTU并获得数千条消息,所以浪费了大量内存。 我在谷歌检查过,有可能找到带有SOTNREAD选项的消息大小为getsockopt系统调用,但这只适用于BSD。我知道消息位于Linux内核的某个地方,因为我的套接字工作在非阻塞模式,并且我被内核事件通知数据可用,因此,它必须存储消息长度,但我怎么能得到它?
提前致谢
答案 0 :(得分:4)
您可能希望将ioctl
与FIONREAD
一起使用。它适用于Linux
和BSD
。
FIONREAD int获取可立即读取的字节数。
if(ioctl(s, FIONREAD, &bytes) != -1)
printf("%d bytes available", bytes);