Network programming 对原始套接字使用recvfrom():一般疑问

Network programming 对原始套接字使用recvfrom():一般疑问,network-programming,recv,raw-sockets,Network Programming,Recv,Raw Sockets,我已经创建了一个原始套接字,它从数据链路层获取所有IPv4数据包(数据链路层头被删除)。为了读取数据包,我使用了recvfrom 我的疑问是: 假设由于操作系统进行了一些调度,我的进程休眠了1秒。当它醒来时,它在这个原始套接字上执行了recvfrom(接收的字节数为1000)(目的是只接收一个IPv4数据包,并且该数据包的大小为380字节)。假设在此期间许多网络应用程序同时运行,那么所有IPv4数据包都必须在该套接字的接收缓冲区中排队。所以现在recvfrom将返回所有1000字节(以及从第38

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

我的疑问是: 假设由于操作系统进行了一些调度,我的进程休眠了1秒。当它醒来时,它在这个原始套接字上执行了
recvfrom
(接收的字节数为1000)(目的是只接收一个IPv4数据包,并且该数据包的大小为380字节)。假设在此期间许多网络应用程序同时运行,那么所有IPv4数据包都必须在该套接字的接收缓冲区中排队。所以现在
recvfrom
将返回所有1000字节(以及从第381字节开始的其他IPv4数据包),因为它的缓冲区中有足够的数据可以返回。虽然我的程序只能理解一个IPv4数据包


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

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

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


如果希望在一个系统调用中读取多个数据包,您可能会感兴趣。仅限最新的Linux内核,没有等效的发送端实现。

您能发布您的代码吗!!!!