【问题标题】:how to capture packets in pcap, and skip ethernet header如何在 pcap 中捕获数据包并跳过以太网标头
【发布时间】:2015-09-18 09:04:42
【问题描述】:

我正在使用 fp = pcap_open_dead(DLT_EN10MB,65535); 以 pcap 格式捕获帧。但是fp = pcap_open_dead(**DLT_XXX** ) 我应该使用 如果我想跳过以太网标头。我的模块在第 3 层工作,所以我想从第 3 层开始捕获数据包。

fp = pcap_open_dead(DLT_EN10MB,65535);
if (NULL == fp)
{
    FPA_ERROR_PRINT("unable to open the dead interface \n");
    return 1;

对此的任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 以太网标头总是 14 字节长,因此您可以将指针前进 14 个位置以跳过它:)

标签: c tcp wireshark libpcap tcpdump


【解决方案1】:

我不认为你可以。解析数据包缓冲区时需要手动跳过以太网头部分。

【讨论】:

  • 这是评论而不是答案
  • @Samer 我无法发布 cmets,需要一定的“声誉”级别:) 无论如何,希望它会有所帮助。
【解决方案2】:

我正在使用fp = pcap_open_dead(DLT_EN10MB,65535); 捕获 pcap 格式的帧。

大概您的意思是“以 pcap 格式将帧写入文件”; “pcap_open_dead”中的“dead”表示“不存在”,如“您无法从中捕获数据包”。

(这是必要的,因为 pcap_dump_open() 调用不采用 DLT_ 值和快照长度作为类型,它采用 pcap_t * 并从那里获取 DLT_ 值和快照长度。如果您是保存使用pcap_open_live()pcap_create()/pcap_activate() 打开的实时捕获的数据包,或使用pcap_open_offline() 打开的另一个捕获文件,但如果数据包不是来自libpcap/WinPcap,则不是很方便。)

但是,如果我想跳过以太网标头,我应该使用什么 fp = pcap_open_dead(DLT_XXX )。我的模块在第 3 层工作,所以我想从第 3 层开始捕获数据包。

如果“第 3 层”表示“IP”,那么您的所有数据包都是 IPv4 或 IPv6 数据包,您需要DLT_RAW

然而,跳过以太网标头是您的工作。如果提供捕获帧的任何机制正在提供带有以太网标头的帧,那么 必须跳过以太网标头 - 并丢弃以太网标头中的类型/长度字段不是 0x0800 的帧IPv4 或 IPv6 的 0x86dd - 并计算适当的捕获长度和在线长度(比捕获的和具有以太网标头的帧的在线长度少 14 个字节;如果其中任何一个小于或等于14,丢弃帧),并将它们连同指向以太网标头后数据的指针一起交给pcap_dump()

【讨论】:

  • 谢谢哈里斯!很有用
猜你喜欢
  • 2014-07-29
  • 2017-02-17
  • 1970-01-01
  • 2013-03-04
  • 2018-04-13
  • 2011-05-28
  • 2012-01-02
  • 2011-07-11
  • 2010-10-15
相关资源
最近更新 更多