繁体   English   中英

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

[英]how to capture packets in pcap, and skip ethernet header

我正在使用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;

任何帮助将对此表示高度赞赏。

提前致谢。

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

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

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

(这是必要的,因为pcap_dump_open()调用不使用DLT_值和快照长度作为类型,而是使用pcap_t *并从那里获取DLT_值和快照长度。如果从a使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM