在原始套接字中使用recvfrom():一般疑问

在原始套接字中使用recvfrom():一般疑问

问题描述:

我创建了一个原始套接字,它从数据链接层获取所有IPv4数据包(数据链接层头已被移除)。并且为了读取我使用的数据包recvfrom在原始套接字中使用recvfrom():一般疑问

我的疑问是: 假设由于某些调度由OS完成,我的过程睡了1秒。当它醒来时,它在这个原始套接字(其目的是接收只有一个 IPv4分组并且假定这个分组的大小是380字节)上做了recvfrom(接收字节数1000)。假设许多网络应用程序在此期间也同时运行,所以所有IPv4数据包必须已在此套接字的接收缓冲区中排队。因此,现在recvfrom将返回全部1000字节(从第381字节开始的其他IPv4数据包)bcoz它的缓冲区中有足够的数据返回。虽然我的程序只是为了理解只有一个IPv4数据包

那么如何防止这件事呢?我应该逐字节读取并解析每个字节,但效率非常低。

+0

你在使用什么操作系统? – abyx 2009-11-25 10:22:42

+0

可以请你发布你的代码!!!! – 2011-01-27 12:22:39

IIRC,recvfrom()将一次只返回一个数据包,即使队列中有更多数据包。

原始套接字在包层操作,没有数据流的概念。

如果您想在一次系统调用中读取多个数据包,您可能会对recvmmsg()感兴趣。最近的Linux内核只有,没有相应的发送端实现。