network-programming - 将recvfrom()与原始套接字一起使用: general doubt

标签 network-programming recv raw-sockets

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

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

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

最佳答案

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

关于network-programming - 将recvfrom()与原始套接字一起使用: general doubt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1795874/

相关文章:

c++ - 使用 std::string 输出

Python recv 多播返回一个字节

c - 混杂模式下的数据包套接字仅接收本地流量

c++ - 绑定(bind)方法给出错误 10038 (WSAENOTSOCK)

c# - 如何(真正)取消 Windows Phone 上的 ConnectAsync 请求?

c - 接收特定消息的socket编程C

android - 可以在同一台机器上安全地运行多个 Android 模拟器并使用套接字进行通信吗?

c - 绑定(bind)到一个 veth 接口(interface)

c++ - cpp-netlib 的二进制文件

c - socket.h 的 recv() 上的段错误