我创建了一个原始套接字,它从数据链路层获取所有IPv4数据包(删除了数据链路层标头)。为了读取数据包,我使用了recvfrom
。
我怀疑是:
假设由于OS完成了一些调度,我的进程睡了1秒钟。当它醒来时,它在这个原始套接字上执行recvfrom
(接收的字节数,比如1000)(目的是接收只有一个 IPv4数据包,并说出这个的大小包是380字节)。并且假设在此期间许多网络应用程序也同时运行,因此所有IPv4数据包必须已在此套接字的接收缓冲区中排队。所以现在recvfrom
将返回所有1000个字节(其他IPv4数据包从第381个字节开始)bcoz它在其缓冲区中有足够的数据返回。虽然我的程序只是为了理解一个IPv4数据包
那么如何预防这件事呢?我应该逐字节读取并解析每个字节,但效率非常低。
答案 0 :(得分:2)
IIRC,recvfrom()
一次只返回一个数据包,即使队列中有更多数据包。
答案 1 :(得分:1)
原始套接字在数据包层运行,没有数据流的概念。
如果您想在一次系统调用中读取多个数据包,则可能对recvmmsg()
感兴趣。最近的Linux内核,没有相应的发送端实现。