2012-04-19 41 views
1

用於int socket(int domain, int type, int protocol); API的文檔說協議指定一個特定的協議,如果一個以上的協議存在對於給定的。這似乎意味着對於給定套接字,只能爲給定域指定一個協議。PCAP如何處理多個協議同時

我在Linux上試過raw socket,但後來我偶然發現了這個協議的事情。我知道pcap庫可以用來捕獲任何協議的數據包。我用pcap編寫了一個Q & D程序,我注意到大部分在if_ether.h文件中定義的常見協議被捕獲。

所以目前在我的節目,我只能指定一個類型的數據包進行捕獲。有沒有方法使用標準Linux頭文件和庫複製pcap行爲? pcap如何實現這一目標?我試圖谷歌的問題,但我認爲我的查詢不健全,因爲我回來的結果沒有太大的用處。

我並不想在這裏解決任何問題,只是學習的概念。

回答

2

在Linux中,與2.0或更高版本的內核,libpcap的套接字上捕獲其中domainPF_PACKETtype要麼SOCK_RAWSOCK_DGRAM,和是htons(ETH_P_ALL)

SOCK_RAW會,對於大多數網絡接口,給你一個鏈路層報頭包;對於一些其他的接口,如PPP接口,它會給你的包鏈路層報頭,這使得它很難確定哪些協議是在鏈路層協議上運行。

SOCK_DGRAM會給你的包而不鏈路層報頭,但也有一些額外的信息; libpcap使用該信息生成a fake link-layer header。您將不得不編寫自己的代碼來處理附加信息。

更多信息請參見the Linux packet(7) man page