使用带有原始套接字的recvfrom():一般怀疑

时间:2009-11-25 10:01:48

标签: network-programming recv raw-sockets

我创建了一个原始套接字,它从数据链路层获取所有IPv4数据包(删除了数据链路层标头)。为了读取数据包,我使用了recvfrom

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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