如何在 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()
.
我正在使用
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()
.