int socket(int domain, int type, int protocol);
API的文档说明,如果给定域存在多个协议,则协议指定特定协议。这似乎意味着只能为给定套接字的给定域指定一个协议。
我正在Linux中试验原始套接字,但后来我偶然发现了这个协议的事情。我知道pcap库可用于捕获任何协议的数据包。我使用pcap编写了一个Q& D程序,我注意到大多数if_ether.h
文件中定义的常用协议都被捕获了。
所以目前在我的程序中我只能指定一种要捕获的数据包。有没有办法用标准Linux头文件和库复制pcap行为? pcap如何实现这一目标?我试图谷歌这个问题,但我认为我的查询格式不正确,因为我得到的结果没什么用处。
我不想在这里解决任何问题,只是学习这个概念。
答案 0 :(得分:2)
在Linux上,使用2.0或更高版本的内核,libpcap在domain
为PF_PACKET
,type
为SOCK_RAW
或SOCK_DGRAM
的套接字上进行捕获, protocol
为htons(ETH_P_ALL)
。
SOCK_RAW
将为您提供带有链路层标头的数据包;对于某些其他接口,例如PPP接口,它将为您提供数据包而不使用链路层标头,这使得很难确定在链路层协议之上运行的协议。
SOCK_DGRAM
会为您提供没有链接层标头的数据包,但会提供一些其他信息; libpcap使用该信息生成a fake link-layer header。您必须编写自己的代码来处理其他信息。
有关详细信息,请参阅the Linux packet(7) man page。