-
Notifications
You must be signed in to change notification settings - Fork 2
/
offlinecapturethread.cpp
84 lines (72 loc) · 2.13 KB
/
offlinecapturethread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "offlinecapturethread.h"
#include "filter.h"
#include "common.h"
#include <QMessageBox>
#include <QStandardItemModel>
#include <QString>
#include <QDebug>
extern QString file_name;
OfflineCaptureThread::OfflineCaptureThread()
{
stopped = false;
}
OfflineCaptureThread::~OfflineCaptureThread(){}
void OfflineCaptureThread::stop()
{
stopped = true;
}
void OfflineCaptureThread::run()
{
int res;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
/* Open the capture file */
if ((adhandle = pcap_open_offline(file_name.toStdString().c_str(), // name of the device
errbuf // error buffer
)) == NULL)
{
QMessageBox::warning(0,"Warning","Unable to open the file "+file_name);
return ;
}
if(!Globe::capPacket.Iniflag)
{
Globe::capPacket.InitialList();
}
qDebug() << "Start capture in offline";
while(!stopped)
{
struct pcap_pkthdr *header=NULL;// header
const u_char *data=NULL; // data
res = pcap_next_ex(adhandle, &header,&data);
if(res>0 && header!=NULL && data!=NULL)
{
// qDebug() << "Valid file";
Globe::capPacket.Countpk++;
Globe::capPacket.AddPacket();
Globe::capPacket.Tail->Initial();
Globe::capPacket.Tail->serialnum=Globe::capPacket.Countpk;
Globe::capPacket.Tail->copy(header,(u_char *)data);
Globe::capPacket.Tail->NAname="FILE";
qDebug() << QString("offline packet is %1").arg(res);
}
else if(res == -1)
{
qDebug()<< "A error occur when pcap_next_ex" ;
stopped = true;
}
else if(res == -2){
qDebug()<< "Read over" ;
stopped = true;
}
else
{
qDebug()<< "Unknown error" ;
stopped = true;
}
}
stopped = false;
emit OfflineStopped();
qDebug() << "emit OfflineStopped";
pcap_close(adhandle);
return ;
}