当我尝试在pcap文件中转储数据包时,我收到错误。
{
unsigned char *ofilename = "packet.pcap";
pcap_t *fp;
pcap_dumper_t *dumpfile;
const struct pcap_pkthdr *header;
fp = pcap_open_dead(DLT_RAW,256);
if(fp != NULL)
{
dumpfile = pcap_dump_open(fp, ofilename);
if(dumpfile == NULL)
{
printf("\nError opening output file\n");
return;
}
pcap_dump((u_char *)dumpfile,header,data);
pcap_close(fp);
pcap_dump_close(dumpfile);
}
}
HERE数据是一个u8数据[256] ..它的256字节数据..它有像这样的包字节
FF FF FF FF FF FF 00 50 56 A8 11 39 81 00 0F FC 81 00 1F FC 08 06 00 01 08 00 06 04 00 01 00 50 56 A8 11 39 65 2B 01 0A 00 00 00 00 00 00 65 2B
但是当我打开packet.pcap时,我得到“捕获文件似乎已损坏或损坏。(pcap:文件有1847605831字节包,大于最大值65535)”
有人可以帮我解决这个问题吗
答案 0 :(得分:0)
尝试诸如
之类的内容{
unsigned char *ofilename = "packet.pcap";
pcap_t *fp;
pcap_dumper_t *dumpfile;
struct pcap_pkthdr header;
fp = pcap_open_dead(DLT_RAW,256);
if(fp != NULL)
{
dumpfile = pcap_dump_open(fp, ofilename);
if(dumpfile == NULL)
{
printf("\nError opening output file\n");
return;
}
header.caplen = 256; /* or however many bytes actually contain packet data */
header.len = 256; /* or however many bytes actually contain packet data */
gettimefoday(&header.ts); /* I'm assuming this is on some flavor of UN*X */
pcap_dump((u_char *)dumpfile,&header,data);
pcap_close(fp);
pcap_dump_close(dumpfile);
}
}
首先,仅仅因为函数采用类型为“{something} *
”的参数,这并不意味着您应该将类型为“{something} *
的变量传递给它”。您必须传递类型为“{something} *
”的值,但它必须是有效值,即必须指向某个内容。
类型为“{something}``*”的未初始化变量,这是您在代码中所拥有的变量,并不指向任何有效的变量。
但是,如果您声明类型为“{something}”的变量,而不是“{something} *
”,则可以对该变量使用&
运算符来获取类型的值“{something} *
”指向变量。
然后,如图所示,如果您将该变量传递给pcap_dump()
,则必须为该变量赋值。您必须设置len
的{{1}}和caplen
成员; struct pcap_pkthdr
成员必须等于数据包数据的实际数字字节数(如果数据包不是,则可能小于数组的大小,在您的情况下,长度恰好为256字节),caplen
成员1}}成员必须至少是该值; len
只会大于len
,如果数据包来自使用“快照长度”值进行的捕获,该值会丢弃超过某个点的数据包中的所有内容,这不是这里的情况,所以caplen
应该等于len
。
您可能还想设置数据包的时间戳;我假设你在这里运行某种形式的UN * X,所以你可以用caplen
来获取当前时间。如果这是带有WinPcap的Windows,你可能还需要做其他事情。
(gettimeofday()
此处不得header
,因为您必须设置它。它不一定是const
;它是const
的声明{ {1}},但这只是意味着const
不会改变它,所以你可以向它传递指向pcap_dump()
的东西的指针;你不是有 pcap_dump()
const`。)
答案 1 :(得分:0)
请在Linux上安装“ pcapfix”,然后按如下所示在损坏的文件上运行
$ pcapfix -d'此处的文件/文件路径'
这将解决它。