第二次寒假作业汇总

第二次寒假作业汇总

这个作业属于哪个课程 2022面向对象程序设计(福州大学)
这个作业要求在哪里 2022面向对象程序设计寒假作业2
这个作业的目标 将路由器的功能抽象为一个数据包分类软件(程序),输入一个数据包,根据相应的规则对数据包进行处理,输出处理结果。
作业正文 如下。
其他参考文献 后文中具体有提到。

一、前言

整个过程磕磕绊绊,总是出现这样那样的问题。最后是用C语言实现的,我的做法比较简单粗暴,没有太多的新知识,可能不具备参考价值,所以阅读需谨慎,也欢迎大家指正错误。这是我的GitHub仓库地址:点这里

二、分析任务要求及需要学习的内容

初步分析一下任务要求,看看需要做哪些事。(个人理解,存在错误请指正,因为是最开始看到作业写下的,存在较多错误的地方。后面学习过程中会指出)

1、如何读入数据集和规则集

需要学习如何使用C语言或C++处理文件

2、分析数据集中的数据包是否和规则集中某个匹配规则相匹配

首先我需要进一步学习计算机网络的相关知识,弄清楚题目中涉及的概念。其次需要我分析二者如何匹配,例如:如何把数据集中的数据包里整数形式(十进制形式)的源IP地址和目的IP地址转换成点分十进制表示的IP地址(进制转换),判断IP地址是否一致,源、目的端口,协议号是否在范围内……

3、如何将匹配结果以文件形式输出

大概就是学习第一点的如何处理文件。

4、分析完整个过程如何用C语言或C++进行实现

会先尝试用C语言(因为C++目前我啥也不会),看看能否实现。还会再学习C++,题目中要求<将每个功能模块写成函数(模块化),可以尝试学习运用C++中类的相关知识提倡将每个模块分成不同的文件,每个函数的功能要明确>,所以花时间学习完C++的相关知识后会根据这个要求尝试一下。将功能模块写成函数,我理解的就是把整个分析过程,按照功能分类,用不同函数实现,比如读入文件,转换IP地址,判断源端口是否在范围内,目的端口?协议号?输出文件等等。

5、测试

如果以上过程都成功推进了,接下来会对程序进行测试,看看结果是否符合要求。

6、优化程序

思考能否进一步优化程序。

7、总结需要学习的内容

  • 熟悉git操作
  • C和C++语言的学习
  • 计算机网络相关知识
  • 如何分析程序的时间复杂度
  • 如何优化程序

三、学习过程

1、前前言

对于我这种自制力极差的人来说,寒假就是在“当天睡前写好计划——第二天打破计划——算了,毁灭吧”这样一个过程中进行的,学的很杂,基本上是需要啥学啥,有时候会在菜鸟教程上看看学一点点c++,但这次作业没有应用到。

2、读取文件和IP地址转换

最开始了解了一下相关计算机网络知识,学习了如何用C语言处理文件(参考资料:C Prime Plus 第六版 以及C 文件读写 | 菜鸟教程 (runoob.com))。

接着,在进行数据集中IP地址换算的时候,我以为只需要把十进制转换成点分十进制就行(其实这样不对,因为它的格式是这样的:178.139.217.251/32或者16.28.114.0/23又或者178.139.217.184/31),而后就能与规则集中的IP地址进行比对。

没错,我没有考虑所谓的CIDR地址,直到有同学在群里提到CIDR问题,我才发觉我的这种做法是不对的。但在我认真阅读了CIDR相关知识之后,我决定暂且放一放(因为我刚开始真的理解不了),先往下走。

3、端口、协议号比对

源端口和目的端口的比对相对简单,在这就不啰嗦了。至于协议号,0x06/0xFF表示协议号,若0x06后是0xFF则表示只有0x06可匹配,若0x06/0x00则表示任意协议都可匹配。其实刚开始不知道怎么处理这个十六进制的协议号,后面抱着尝试的心态,试了一下,如下图

发现是可以直接比较的(不知道符不符合相关语法规定,暂且先这样,这里只是简单的数字大小测试,实际的协议号匹配不是上图那样。)

4、输出结果

刚开始只是想看看程序能不能跑起来,所以就没有输出成文件。结果前面有个步骤忘记初始化,导致结果多出来九百多行。后面初始化之后才正常,大致先比对一下,如下图。

有些数据答案是不匹配的,为了精确到底有多少组不匹配,我就尝试写了另一个程序来检查是哪些数据与答案不一致,结果有点吓人,9000多组数据有400多组不匹配……大概率是上面IP地址转换的问题(就是那个我暂且跳过的CIDR),可能协议号的判断也存在问题。

5、关键代码(主要是匹配过程)

四、程序设计思路

我的思路比较简单粗暴,就先用数组存储规则集中的数据,再按行读取数据集中的数据,并与规则集中数据进行比对,最后输出为文件。

五、过程中遇到的问题

1、文件读入问题(协议号范围读入)

刚开始碰到规则集中的数据时,不知道怎么把数据读入,因为它前有@,中间有.,后有十六进制的数。最后,抱着尝试的心态,敲了下图代码

这是运行结果,说明是可以的

2、IP地址比对问题

上面已经提到过我是直接简单粗暴地把十进制转换成点分十进制(这个过程应该也是存在问题的),而规则集中的是CIDR表示法,所以导致了上述部分答案不匹配。

六、总结

因为得到的结果和答案并不完全一致,说明还是存在很大问题的(我也不知道那些恰好匹配的算不算瞎猫碰到死耗子)。由于个人能力问题以及时间问题,这次的任务只能暂且做到这里,任务不算完成,会再去认真看看CIDR的相关内容,也看看过程中其他代码是否存在问题,作业中提到的运行时间、优化完善,会在接下来的两三天内尝试进行的。欢迎大家指出错误的地方!

七、参考文献

posted @ 2022-01-30 21:16  seven47  阅读(40)  评论(1编辑  收藏  举报