2

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

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

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

4

2 回答 2

2

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

于 2009-11-25T10:25:50.890 回答
1

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

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

于 2010-08-18T09:45:55.893 回答