1

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

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

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

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

4

1 回答 1

2

在 Linux 上,使用 2.0 或更高版本的内核,libpcap 在一个套接字上捕获domainis PF_PACKETtypeisSOCK_RAWSOCK_DGRAM、 and protocolis htons(ETH_P_ALL)

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

SOCK_DGRAM将为您提供没有链路层标头但带有一些附加信息的数据包;libpcap 使用该信息生成一个虚假的链路层标头。您必须编写自己的代码来处理这些附加信息。

有关更多信息,请参见Linux packet(7) 手册页

于 2012-04-19T07:03:57.963 回答