我正在使用fp = pcap_open_dead(DLT_EN10MB,65535);
来捕获pcap格式的帧。但是,如果我想跳过以太网头fp = pcap_open_dead(**DLT_XXX** )
,我应该使用什么。我的模块正在第三层工作,所以我想从第三层开始捕获数据包。
fp = pcap_open_dead(DLT_EN10MB,65535);
if (NULL == fp)
{
FPA_ERROR_PRINT("unable to open the dead interface \n");
return 1;
在这方面的任何帮助都将受到高度赞赏。
提前谢谢。
发布于 2015-07-01 18:46:13
我正在使用
fp = pcap_open_dead(DLT_EN10MB,65535);
来捕获pcap格式的帧。
您的意思大概是“以pcap格式将帧写入文件”;"pcap_open_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 )。我的模块正在第三层工作,所以我想从第三层开始捕获数据包。
如果“第三层”的意思是"IP",所以您的所有数据包都是IPv4或IPv6数据包,则需要DLT_RAW
。
然而,跳过以太网报头是您的工作。如果提供捕获的帧的任何机制都是提供以太网报头的帧,则必须跳过以太网报头--并丢弃以太网报头中的类型/长度字段对于IPv4来说不是0x0800或IPv6中的0x86dd以外的帧--并计算出适当的捕获长度和连接长度(比捕获和打开的长度少了14个字节;如果其中任何一个小于或等于14,则丢弃该帧),并将这些帧连同指向以太网报头后的数据的指针交给pcap_dump()
。
发布于 2015-07-01 13:44:09
我觉得你做不到。解析数据包缓冲区时,需要手动跳过以太网报头部分。
https://stackoverflow.com/questions/31157387
复制相似问题