第二次寒假作业(事真的难)
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2022OOP |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2022OOP/homework/12432 |
这个作业的目标 | 提供规则集和数据集,输出数据集中数据包所最佳匹配的规则位置,数据集和规则集用文件的形式读入,匹配结果以文件的形式输出; |
作业正文 | 如下 |
其他参考文献 | 谭浩强《C语言程序设计(第五版)》 |
前言
本次作业我使用的编程语言是C语言,IDE是dev c++。
完成本次作业需要学习的内容
- 了解数据包与规则的五元组的匹配规则
- C语言相关知识,包括打开文件及读写文件的方法
- 进制转换的知识,由于数据包五元组与规则五元组的数据所使用的进制不同,因此在匹配前需先将二者转换成同进制
学习过程
先是回顾了一遍课本《C语言程序设计(第五版)》,学习了C语言中操作文件的相关知识,接着就是在编程序的过程中什么不会学什么了。
设计思路与代码
-
设计思路:先在其他文件中构建能够读取数据包与规则的函数,以及具有进制转换功能的函数,再在一个主程序中调用这些函数获取相关信息,进行规则匹配,并输出结果。
-
首先是主程序文件:
maindd.cpp
,以下是其代码:
在开头打开数据集文件与规则集文件,引入计数器cnt
,使每获取到一条规则,都让cnt
的值+1。定义ip1
,ip2
分别为规则中源、目的ip地址的十进制数。
(数据包的个数是9191,规则的个数是919)
利用for
循环进行数据的获取与匹配。先定义一维数组dat[5]
存储一个数据包的五元组,并用一个指针指向它。通过调用read_data
函数获取数据包,并将其输出。接着再开一个for
循环来不断获取规则与数据包匹配。定义数组range[4]
存储规则中源、目的端口范围的4个数字。调用函数read_rule
来获取一条规则,用dianfen0
与dianfen1
函数将源、目的ip地址的点分十进制数转化为一个十进制数,并赋给ip1
,ip2
。用dkrange
函数将规则中源、目的端口范围的4个数字存储在数组range[]
中。
然后用if
进行匹配,并输出匹配结果。
-
以下是数据包获取文件
read_data0.cpp
:
函数功能为按字符形式读取一个数据包的五元组,并转化为数字存在一维数组中,并返回数组地址。 -
接着是规则获取文件
read_rule0.cpp
:
功能如图。 -
最后是数据转换文件
transfer.cpp
:
四个函数的功能如图:
- 至此,本程序算设计完成了。这是我的github仓库主页,代码都已git上去。
遇到的困难
-
很遗憾,最后输出的结果与答案不怎么相同,但我实在是不知道怎么改了。
因为程序失败了,所以也没有写能将结果输出到文件中的功能
各个模块的功能我都测试过了,都没有问题,但是不知道为什么最后会失败 /捂脸 -
然后是我们的C语言课本有些语法在dev c++中似乎不怎么能用,比如用指针表示二维数组元素的方法(书上有个方法是用
*(*(str+i)+j)
来表示str[i][j]
,但是在dev c++不能这么表示)。 -
可惜C语言无法将二维数组的其中一行当一维数组传参,不然代码就会好写很多了(好吧也有可能是我不会,但可惜我在网上没查到方法)
最后,虽然代码写得确实不怎么样,还是希望有大佬指教一番。