【问题标题】:How can I parse an ethernet packet using libpcap?如何使用 libpcap 解析以太网数据包?
【发布时间】:2011-08-31 23:22:31
【问题描述】:

我在 C++ 中使用 libpcap 从 pcap 文件中读取数据包,例如:

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

我想解析数据包头(没有负载)。

例如,我如何解析给定的数据包以提取其源和目标 IP 地址?

谢谢

【问题讨论】:

  • 如果你想使用 C++ 为什么不使用一个包装 libpcap 并提供内置协议解析器的库呢?我可以推荐我正在使用的PcapPlusPlus,请参阅this tutorial 了解如何使用此库解析数据包。

标签: c++ parsing packet libpcap


【解决方案1】:

查看 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);

如果你想解析其他协议,你只需要定义你自己的结构。如果您想要(或不想要)解析有效负载,那么您可以(或不)定义一个指向有效负载开头的指针。

【讨论】:

  • Pcap 有过滤器,它使用数据包中的数据进行过滤。因此,我得出结论,它知道哪些数据在哪里,它是否可以提供这些数据? (例如作为头文件)
【解决方案2】:

IP 报头的数据字段以大端顺序打包,数据包有效负载紧跟在 IP 报头的末尾。看一个例子here

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2016-10-19
    • 2013-03-04
    • 2010-11-20
    相关资源
    最近更新 更多