第二次寒假作业汇总
第二次寒假作业汇总
这个作业属于哪个课程 | 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的相关内容,也看看过程中其他代码是否存在问题,作业中提到的运行时间、优化完善,会在接下来的两三天内尝试进行的。欢迎大家指出错误的地方!
七、参考文献
- CIDR地址划分方法
- C语言的文件读取与写入操作
- C Prime Plus 第六版
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?