2012-04-09 38 views
0

UDP数据包大小我知道,阅读,你可以发出此系统调用内核之前找出UDP数据包的大小:知道有投票选择或epoll的

ioctl(s,FIONREAD,&num_bytes); 

但是,我可以找出相同与以下系统调用之一?

poll() 
select() 
epoll() 

关键是在读取数据报之前知道数据报的大小,为缓冲区分配空间。 这仅是为Linux,在C.

+2

我很确定'recvfrom'有一个'MSG_PEEK'标志,你可以用它来查询包中的字节数(并且预览它的内容而不从它中删除它队列),这将比丑陋的'ioctl'解决方案更便于携带... :-) – 2012-04-09 16:55:59

+0

最大UDP数据报大小为64K,但是您是否曾经获得大于1472字节的UDP消息?那是什么协议? – 2012-04-09 18:12:21

+0

@R。谢谢R,好的提示。我在寻找的是保存在系统调用上,如果提到的3个系统调用中的一些可以给我可用数据包的大小(除了通知我在描述符上有数据可供读取),这对速度会很有帮助(因为当应用程序正在等待输入时,我必须使用上述3中的一个) – Nulik 2012-04-09 18:19:25

回答

0

复用系统调用等pollselect期待一组条件来观看(如输入可用于FD#5,输出有可能在FD#7),并告诉你哪些文件描述符是可读的(哪些是可写的等)。一旦你知道哪个文件描述符可以被读取,你就可以在你可读的文件描述符fd上使用ioctl(fd, FIONREAD, &numbytes)。所以你应该同时使用poll然后FIONREAD ...

+0

我相当肯定,使用UDP,您可以期望通过单个'read'或'recv'调用来接收单个数据包,因为您的缓冲区足够大。 (显然这对TCP来说不是这样) – 2012-04-09 16:37:13

+0

这是正确的。套接字接口将只返回完整的数据包,而不是片段。 – Perry 2012-04-09 16:40:47

+0

我以为允许路由器对UDP数据包进行分片..我删除了最后一句.. – 2012-04-09 16:43:30

相关问题