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

Posted

技术标签:

【中文标题】将 recvfrom() 与原始套接字一起使用:一般疑问【英文标题】:Using recvfrom() with raw sockets : general doubt 【发布时间】:2009-11-25 10:01:48 【问题描述】:

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

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

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

【问题讨论】:

你能把你的代码贴出来吗!!! 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于将 recvfrom() 与原始套接字一起使用:一般疑问的主要内容,如果未能解决你的问题,请参考以下文章

UDP和套接字,recvfrom()返回-1,资源暂时不可用

Linux进程间通信 -- 数据报套接字 socket()bind()sendto()recvfrom()close()

套接字关闭时取消阻止 recvfrom

如何使用 recvfrom 获取 AF_INET6 套接字的地址

Windows 上没有从 recvfrom 收到任何内容

UDP并发客户端recvfrom错误