gpt4 book ai didi

linux - pcap 如何同时处理多个协议(protocol)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:05 24 4
gpt4 key购买 nike

int socket(int domain, int type, int protocol); API 的文档说,如果存在多个协议(protocol),protocol 指定一个特定的协议(protocol)给定的。这似乎意味着只能为给定套接字的给定域指定一种协议(protocol)。

我在 Linux 中试验原始套接字,但后来我偶然发现了这个协议(protocol)。我知道 pcap 库可用于捕获任何协议(protocol)的数据包。我使用 pcap 编写了一个 Q&D 程序,我注意到捕获了 if_ether.h 文件中定义的大多数常见协议(protocol)。

所以目前在我的程序中我只能指定一种类型的数据包来捕获。有没有办法用标准的 Linux 头文件和库复制 pcap 行为? pcap 是如何做到这一点的?我试着用谷歌搜索这个问题,但我认为我的查询格式不正确,因为我得到的结果没有多大用处。

我不打算在这里解决任何问题,只是学习概念。

最佳答案

在 Linux 上,使用 2.0 或更高版本的内核,libpcap 在 domainPF_PACKETtype 的套接字上捕获SOCK_RAWSOCK_DGRAMprotocolhtons(ETH_P_ALL)

SOCK_RAW 将为大多数网络接口(interface)提供带有链路层 header 的数据包;对于其他一些接口(interface),例如 PPP 接口(interface),它会给您没有链路层报头的数据包,这使得很难确定链路层协议(protocol)之上运行的是什么协议(protocol)。 p>

SOCK_DGRAM 将为您提供没有链路层 header 的数据包,但带有一些附加信息; libpcap 使用该信息生成 a fake link-layer header .您将不得不编写自己的代码来处理这些附加信息。

参见 the Linux packet(7) man page获取更多信息。

关于linux - pcap 如何同时处理多个协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10220634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com