第二次寒假作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2022OOP |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2022OOP/homework/12442 |
这个作业的目标 | <读取规则和数据包,输出数据包的最佳匹配规则> |
作业正文 | 如下 |
其他参考文献 | C函数快查 CSDN博客 |
学习内容
1.C语言读写文件
2.计算机网络中规则集,数据集,规则匹配等概念
3.IP地址相关概念
学习过程
首先我通过C Primer Plus这本书学习C语言中有关文件读写的部分。但是感觉没看懂,又参考了CSDN上的文章和网上的教学视频,成功弄懂了。
然后继续通过SCDN上的文章了解了IP地址的相关概念。
程序设计思路
- 读取命令,记录文件名为字符串。
- 然后字符串用打开规则集,读取规则并存放到自己定义的结构体内。
- 打开数据集文件,读取数据并与存放在结构体内的规则匹配,将匹配结果写入res.txt文件。
其中匹配功能通过自己编写的函数实现。
void num_10_to_2_8(int num, char arr[9]) {
int i;
for (i = 7; i >= 0; i--) {
arr[i] = '0';
}
for (i = 7; i >= 0; i--) {
arr[i] = num % 2 + 48;
num = num / 2;
}
}//这个函数把读取的十进制数转化为8位的二进制数,用于IP地址转化
#include <math.h>
#include "head.h"
long long up_ipaddress_to_ipnum(int a1, int a2, int a3, int a4, int a5) {
long long ipad = 0;
char ipad1[9], ipad2[9], ipad3[9], ipad4[9];
num_10_to_2_8(a1, ipad1);//把前四个
num_10_to_2_8(a2, ipad2);//参数转化
num_10_to_2_8(a3, ipad3);//为八位的
num_10_to_2_8(a4, ipad4);//二进制
int i;
char ss[33];//统一存放在一起
for (i = 0; i < 8; i++)
ss[i] = ipad1[i];
for (i = 8; i < 16; i++)
ss[i] = ipad2[i - 8];
for (i = 16; i < 24; i++)
ss[i] = ipad3[i - 16];
for (i = 24; i < 32; i++)
ss[i] = ipad4[i - 24];
while (a5 < 32) {//根据网络前缀置1
ss[a5] = 49;
a5++;
}
for (i = 0; i < 32; i++)
ipad += pow(2, i) * (ss[31 - i] - 48);
return ipad;
}
这个函数把一个传入的CIDR表示的IP地址转化为十进制表示的上限。如图所示
下限的函数同理。
int match(long long in1, long long in2, int in3, int in4, int in5, long long aup,
long long adown, long long bup, long long bdown, int cup, int cdown, int dup,
int ddown, int eup, int edown, int i) {
int sign1 = 0, sign2 = 0, sign3 = 0, sign4 = 0, sign5 = 0;
if (in1 >= adown && in1 <= aup)//匹配源IP地址
sign1 = 1;
if (in2 >= bdown && in2 <= bup)//匹配目的IP地址
sign2 = 1;
if (in3 >= cdown && in3 <= cup)//匹配源端口
sign3 = 1;
if (in4 >= ddown && in4 <= dup)//匹配目的端口
sign4 = 1;
if (in5 >= edown && in5 <= eup)//匹配协议
sign5 = 1;
if (edown == 0 && eup == 0)//匹配协议
sign5 = 1;
if (sign1 + sign2 + sign3 + sign4 + sign5 != 5)
i = -1;
return i;//这个是匹配函数
}
以上函数每个存在一个·c文件,然后函数的声明和结构体的定义放在头文件
struct rulelist { //定义结构体存放规则集数据
long long up_ip_s;//源IP地址上限
long long down_ip_s;//源IP地址下限
long long up_ip_d;//目的IP地址上限
long long down_ip_d;//目的IP地址下限
int up_port_s;//源端口上限
int down_port_s;//源端口下限
int up_port_d;//目的端口上限
int down_port_d;//目的端口下限
int up_agreement;//协议上限
int down_agreement;//协议下限
} rulefile[1000];
这是我定义的结构体
github主页
先写这么多了,代码应该还有问题,慢慢找吧
改进思考
我匹配规则是从头到尾暴力匹配,规则集的储存可以进行优化,优化匹配的过程