使用 libpcap 将 pcap 数据包写入结构
Writing pcap packets into a structure with libpcap
我有一个由 wireshark 捕获的 pcap 文件,现在我需要读取它的每个数据包并将它们写入一个结构向量。我在将数据包写入结构时遇到了一些问题。
结构:
struct pktStruct {
struct pcap_pkthdr * pkt_header; // header object
const u_char * pkt_data; // data object
long time; // used to compare with each other
};
我如何将每个数据包保存到结构的代码:
string resultFile = "/home/xing/Desktop/tmp.pcap";
char errbuff[PCAP_ERRBUF_SIZE];
pcap_t * resultPcap = pcap_open_offline(resultFile.c_str(), errbuff);
struct pcap_pkthdr * header; // header object
const u_char * data; // data object
vector<pktStruct> pktVector; // this vector contains each pktStruct
pktStruct myStruct;
while (int i=pcap_next_ex(resultPcap,&header,&data) >=0) {
myStruct.pkt_header = header;
myStruct.pkt_data = data;
myStruct.time = header->ts.tv_sec * 1000000 + header->ts.tv_usec;
pktVector.push_back(myStruct);
}
当我打印每个数据包的信息时,我发现每个存储数据包的结构都是完全相同的。我是否将相同的数据包保存到矢量的每个结构?
您从 libpcap/WinPcap 获得的数据包 header 和数据指针 不是 永远有效。
如果您使用 pcap_loop()
或 pcap_dispatch()
,在您的回调 returns 之后,传递给您的回调的数据包 header 和数据指针将不会指向当您的回调是 运行.
时,他们所做的数据相同
如果您正在使用 pcap_next()
或 pcap_next_ex()
,在您再次调用有问题的例程后,您从该例程获得的先前指针将不会指向它们所指向的相同数据之前。
所以你必须复制数据包header和数据:
struct pktStruct {
struct pcap_pkthdr pkt_header; // header object - *not* a pointer
const u_char * pkt_data; // data object
long time; // used to compare with each other
};
和
string resultFile = "/home/xing/Desktop/tmp.pcap";
char errbuff[PCAP_ERRBUF_SIZE];
pcap_t * resultPcap = pcap_open_offline(resultFile.c_str(), errbuff);
struct pcap_pkthdr * header; // header object
const u_char * data; // data object
const u_char * data_copy;
vector<pktStruct> pktVector; // this vector contains each pktStruct
pktStruct myStruct;
while (int i=pcap_next_ex(resultPcap,&header,&data) >=0) {
myStruct.pkt_header = *header;
data_copy = (u_char *)malloc(myStruct.pkt_header.caplen);
memcpy(data_copy, data, myStruct.pkt_header.caplen);
myStruct.pkt_data = data_copy;
myStruct.time = header->ts.tv_sec * 1000000 + header->ts.tv_usec;
pktVector.push_back(myStruct);
}
这意味着您可能需要释放这些副本。
我有一个由 wireshark 捕获的 pcap 文件,现在我需要读取它的每个数据包并将它们写入一个结构向量。我在将数据包写入结构时遇到了一些问题。 结构:
struct pktStruct {
struct pcap_pkthdr * pkt_header; // header object
const u_char * pkt_data; // data object
long time; // used to compare with each other
};
我如何将每个数据包保存到结构的代码:
string resultFile = "/home/xing/Desktop/tmp.pcap";
char errbuff[PCAP_ERRBUF_SIZE];
pcap_t * resultPcap = pcap_open_offline(resultFile.c_str(), errbuff);
struct pcap_pkthdr * header; // header object
const u_char * data; // data object
vector<pktStruct> pktVector; // this vector contains each pktStruct
pktStruct myStruct;
while (int i=pcap_next_ex(resultPcap,&header,&data) >=0) {
myStruct.pkt_header = header;
myStruct.pkt_data = data;
myStruct.time = header->ts.tv_sec * 1000000 + header->ts.tv_usec;
pktVector.push_back(myStruct);
}
当我打印每个数据包的信息时,我发现每个存储数据包的结构都是完全相同的。我是否将相同的数据包保存到矢量的每个结构?
您从 libpcap/WinPcap 获得的数据包 header 和数据指针 不是 永远有效。
如果您使用 pcap_loop()
或 pcap_dispatch()
,在您的回调 returns 之后,传递给您的回调的数据包 header 和数据指针将不会指向当您的回调是 运行.
如果您正在使用 pcap_next()
或 pcap_next_ex()
,在您再次调用有问题的例程后,您从该例程获得的先前指针将不会指向它们所指向的相同数据之前。
所以你必须复制数据包header和数据:
struct pktStruct {
struct pcap_pkthdr pkt_header; // header object - *not* a pointer
const u_char * pkt_data; // data object
long time; // used to compare with each other
};
和
string resultFile = "/home/xing/Desktop/tmp.pcap";
char errbuff[PCAP_ERRBUF_SIZE];
pcap_t * resultPcap = pcap_open_offline(resultFile.c_str(), errbuff);
struct pcap_pkthdr * header; // header object
const u_char * data; // data object
const u_char * data_copy;
vector<pktStruct> pktVector; // this vector contains each pktStruct
pktStruct myStruct;
while (int i=pcap_next_ex(resultPcap,&header,&data) >=0) {
myStruct.pkt_header = *header;
data_copy = (u_char *)malloc(myStruct.pkt_header.caplen);
memcpy(data_copy, data, myStruct.pkt_header.caplen);
myStruct.pkt_data = data_copy;
myStruct.time = header->ts.tv_sec * 1000000 + header->ts.tv_usec;
pktVector.push_back(myStruct);
}
这意味着您可能需要释放这些副本。