第二次寒假作业(事真的难)

这个作业属于哪个课程 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来获取一条规则,用dianfen0dianfen1函数将源、目的ip地址的点分十进制数转化为一个十进制数,并赋给ip1,ip2。用dkrange函数将规则中源、目的端口范围的4个数字存储在数组range[]中。


然后用if进行匹配,并输出匹配结果。

  • 以下是数据包获取文件read_data0.cpp:

    函数功能为按字符形式读取一个数据包的五元组,并转化为数字存在一维数组中,并返回数组地址。

  • 接着是规则获取文件read_rule0.cpp:

    功能如图。

  • 最后是数据转换文件transfer.cpp
    四个函数的功能如图:




遇到的困难

  • 很遗憾,最后输出的结果与答案不怎么相同,但我实在是不知道怎么改了。

    因为程序失败了,所以也没有写能将结果输出到文件中的功能
    各个模块的功能我都测试过了,都没有问题,但是不知道为什么最后会失败 /捂脸

  • 然后是我们的C语言课本有些语法在dev c++中似乎不怎么能用,比如用指针表示二维数组元素的方法(书上有个方法是用*(*(str+i)+j)来表示str[i][j],但是在dev c++不能这么表示)。

  • 可惜C语言无法将二维数组的其中一行当一维数组传参,不然代码就会好写很多了(好吧也有可能是我不会,但可惜我在网上没查到方法)

      最后,虽然代码写得确实不怎么样,还是希望有大佬指教一番。

posted @ 2022-01-30 19:25  Lofey  阅读(67)  评论(0编辑  收藏  举报