pcap如何同时处理多个协议

时间:2012-04-19 01:57:01

标签: linux sockets pcap packet-sniffers

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

对于大多数网络接口,

SOCK_RAW将为您提供带有链路层标头的数据包;对于某些其他接口,例如PPP接口,它将为您提供数据包而不使用链路层标头,这使得很难确定在链路层协议之上运行的协议。

SOCK_DGRAM会为您提供没有链接层标头的数据包,但会提供一些其他信息; libpcap使用该信息生成a fake link-layer header。您必须编写自己的代码来处理其他信息。

有关详细信息,请参阅the Linux packet(7) man page