如何在 pcap 中捕获数据包,并跳过以太网 header

how to capture packets in pcap, and skip ethernet header

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

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

如能提供任何帮助,我们将不胜感激。

提前致谢。

我认为你做不到。解析数据包缓冲区时需要手动跳过Ethernet header部分。

I am using fp = pcap_open_dead(DLT_EN10MB,65535); to capture frames in pcap format.

想必你的意思是"to write frames to a file in pcap format"; "pcap_open_dead" 中的 "dead" 表示 "not live",如 "you can't capture packets from this".

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

But what fp = pcap_open_dead(DLT_XXX ) should I use if I want to skip the ethernet header. My module is working on layer 3 , so I want to capture packets starting from layer 3.

如果"layer 3"表示"IP",那么你所有的数据包都是IPv4或者IPv6数据包,你想要DLT_RAW.

不过,跳过以太网 header 是 您的 工作。如果提供捕获帧的任何机制正在为以太网 headers 提供帧,那么 you 必须跳过以太网 header - 并丢弃 [=以太网 header 中的 41=] 字段是 IPv4 的 0x0800 或 IPv6 的 0x86dd 以外的任何其他内容 - 并计算适当的捕获长度和 on-the-wire 长度(比捕获的长度少 14 个字节,on-the-wire以太网帧的长度 headers;如果其中任何一个小于或等于 14,则丢弃该帧),然后将这些连同指向以太网 header 之后的数据的指针一起交给pcap_dump().