暑期总结

小学期一直在忙小程序的设计,现在放上来吧,也最后做个总结:

一、Libcap的使用:

1.头文件环境相关:

用的是ubuntu18.04的环境

(1)头文件及环境配置:

1
2
3
4
5
6
7
8
9
10
//注释头


#include <pcap.h>

//cmd Programmer need
-lpcap

//QT pro need
LIBS += -L/usr/local/lib -lpcap

同时需要root权限,QT可以设置

(2)QThread使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//注释头

class libcapThread : public QThread
{
Q_OBJECT
public:
//overwrite
void run();


signals:
void signalpcap(QString,QString,QString,
QString,QString,const u_char*);
};
//注释头

threadObj->start();
threadObj->terminate();

2.抓包流程:

(1)搜索网卡dev:

dev = pcap_lookupdev(errbuf);

这个只能搜索到第一个可用网卡,有的装了docker啥的会存在多个网卡,需要用其他函数。

(2)编译抓取规则:

pcap_compile(devHandle, &filter, “tcp”, 0, deviceMask);

(3)设置抓取规则:

pcap_setfilter(devHandle, &filter);

(4)抓包:

pcap_loop(devHandle, 1, baseAnalyze, NULL);

▲大概就是这样,然后这里一般需要用到回调函数baseAnalyze()来处理包数据,回调函数可自行得到的参数如下:

void baseAnalyze(u_char* user, const struct pcap_pkthdr* pHeader, const u_char* pPktdata)

3.然后就是正常处理显示了,直接贴程序:

https://github.com/PIG-007/Programmer/tree/master/Libcap

二、加解密双机的使用:

▲做了双机的服务器端和DES,AES,还有几个古典,其他的是同学做的,特此说明一下。

1.Socket

(1)创建对象:

1
2
3
//注释头

server = new QTcpServer(this);

(2)开始监听:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//注释头

connect(ui->btnListen,&QPushButton::clicked,[this]{
//if Listening,close it
if(server->isListening()){
//server->close();
closeServer();//Define function
//Recover the status after closed
}else{
const QString address_text=ui->editAddress->text();
const QHostAddress address=(address_text=="Any")
?QHostAddress::Any
:QHostAddress(address_text);
const unsigned short port=ui->editPort->text().toUShort();
if(server->listen(address,port)){
//handle function
}else{
//error function
}
}
}

(3)检测到连接,开始处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
//注释头

connect(server,&QTcpServer::newConnection,this,[this]{
while(server->hasPendingConnections())
{
//nextPendingConnection get the next obj
QTcpSocket *socket=server->nextPendingConnection();
clientList.append(socket);
ui->textRecv->append(QString("(%1:%2) Soket Connected")
.arg(socket->peerAddress().toString())
.arg(socket->peerPort()));
ui->textRecv->append(recv_text);
});

(4)错误信息处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
//注释头

connect(socket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error),
[this,socket](QAbstractSocket::SocketError)
{
//Handle
});
//注释头

connect(socket,&QAbstractSocket::errorOccurred,[this,socket](QAbstractSocket::SocketError)
{
//Handle
});

2.界面设计的不同style:

1
2
3
//注释头

qApp->setStyle(QStyleFactory::create("fusion"));

3.加密模块:

很多内容就放github上,不再赘述

https://github.com/PIG-007/Programmer/tree/master/SocketEncrypt