将recvfrom() 与原始套接字一起使用:一般疑问

发布于 2024-08-12 12:46:03 字数 444 浏览 8 评论 0原文

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

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

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

I have created a raw socket which takes all IPv4 packets from data link layer (with data link layer header removed). And for reading the packets I use recvfrom.

My doubt is:
Suppose due to some scheduling done by OS, my process was asleep for 1 sec. When it woke up,it did recvfrom (with number of bytes to be received say 1000) on this raw socket (with the intention of receiving only one IPv4 packet and say the size of this packet is 380 bytes). And suppose many network applications were also running simultaneously during this time, so all IPv4 packets must have been queued in the receive buffer of this socket. So now recvfrom will return all 1000 bytes (with other IPv4 packets from 381th byte onwards) bcoz it has enough data in its buffer to return. Although my program was meant to understand only one IPv4 packet

So how to prevent this thing? Should I read byte by byte and parse each byte but it is very inefficient.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清晰传感 2024-08-19 12:46:03

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

IIRC, recvfrom() will only return one packet at a time, even if there are more in the queue.

守望孤独 2024-08-19 12:46:03

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

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

Raw sockets operate at the packet layer, there is no concept of data streams.

You might be interested in recvmmsg() if you want to read multiple packets in one system call. Recent Linux kernels only, there is no equivalent send side implementation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文