我正在使用
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;
对此的任何帮助都将受到高度赞赏。
提前致谢。
答案 0 :(得分:0)
我认为你不能。在解析数据包缓冲区时,您需要手动跳过以太网标头部分。
答案 1 :(得分:0)
我正在使用
fp = pcap_open_dead(DLT_EN10MB,65535);
以pcap格式捕获帧。
大概你的意思是"以pcap格式将文件写入文件&#34 ;; "死了"在" 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 )。我的模块正在处理第3层,所以我想从第3层开始捕获数据包。
如果"第3层"意味着" IP",以便您的所有数据包都是IPv4或IPv6数据包,您需要DLT_RAW
。
然而,跳过以太网标头是您的作业。如果提供捕获帧的任何机制正在为帧提供以太网报头,那么你必须跳过以太网报头 - 并丢弃以太网报头中的类型/长度字段不是0x0800的帧。用于IPv6的IPv4或0x86dd - 并计算适当的捕获长度和线上长度(比使用以太网报头的帧的捕获和线上长度少14个字节;如果其中任何一个小于或等于14,丢弃帧),并将这些指针与指向以太网报头后的数据的指针交给pcap_dump()
。