2011-05-24 181 views
4

我使用的libpcap在C++中用於從PCAP文件中讀取的數據包,例如:如何使用libpcap解析以太網數據包?

rc = pcap_next_ex((pcap_t*)handle, &header, (const unsigned char**)packet); 

我想解析分組報頭(沒有有效載荷)。

例如,如何解析給定的數據包以提取其源和目的地址?

感謝

+0

如果您想使用C++,爲什麼不使用包裝libpcap並提供內置協議解析器的庫?我可以推薦我使用的[PcapPlusPlus](https://github.com/seladb/PcapPlusPlus),請參閱[本教程](http://seladb.github.io/PcapPlusPlus-Doc/tutorial_packet_parsing.html)學習如何使用這個庫解析數據包。 – John 2017-07-27 23:03:43

回答

2

IP報頭的數據字段被包裝在大端順序和分組有效載荷是在IP報頭的末端之後附接。看到一個例子here

5

結帳爲libpcap的http://www.tcpdump.org/pcap.html

got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);函數的代碼示例你有一個指針*packet指向分組的開始。解析以太網頭,你只需要使用相應的指針

ethernet = (struct sniff_ethernet*)(packet); 

對於IP層

ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); 

如果你想解析其它協議,你只需要定義自己的結構。如果你想(或不想)分析有效載荷,那麼你可以(或不)定義一個指向有效載荷開始的指針。

+0

Pcap有過濾器,它使用數據包中的數據進行過濾。因此我得出結論,它知道哪些數據在哪裏,它是否可用? (例如作爲頭文件) – 2016-07-29 12:02:19