一次重组程序的经历

原创 2005年05月16日 23:07:00
整整费了N久功夫,终于重组好了毕设程序的构架,头晕晕的,简单叙述一下改写的经过,分享一下自己的感受,顺便自勉也整理一下思路O_O
系统环境:RedHat 9.0
开发语言:C
编译器:gcc
                                                                                                                                               
原来程序包含的文件:Sniff.h,Sniff.c,Smtp.c,main.c
makefile文件内容:
--------------------------
CC=gcc
                                                                                                                                               
Sniffer:Sniff.o Smtp.o main.o
        $(CC) -lpcap main.o Sniff.o Smtp.o -o Sniffer
main.o:main.c
        $(CC) -c main.c -o main.o
Sniff.o:Sniff.c
        $(CC) -c Sniff.c -o Sniff.o
Smtp.o:Smtp.c
        $(CC) -c Smtp.c -o Smtp.o
clean:
        rm -f *.o
        rm -f *.*~
        rm -f *~
--------------------------
                                                                                                                                               
原来的程序的基本数据结构,全局变量都在Sniff.h文件里,因为只有smtp一个模块,比较简单,做完smtp模块后现在想扩充一个模块进去(webmail模块),然后发现问题出现了,首先,我希望smtp和webmail模块是分开的,即除了公用的一些数据结构以外,不要有其它的关联,然后希望的程序调用过程大致是:
main->sniff->一些既定条件->子模块(smtp模块或者webmail模块)
这样的话也有利于以后模块的扩充
                                                                                                                                               
然后我新建了smtp.h的头文件,把只有smtp需用的数据结构放在里头,然后用sniff.h包含smtp.h,发现一个问题:公用数据结构在sniff.h里,smtp必须要用到,所以smtp需要包含sniff.h头文件,而sniff.h是包含smtp.h的,汗@_@文件循环包含,不行
于是我尝试把公用的数据结构放在一个公共的头文件里(main.h),再用smtp.h包含它,sniff.h包含smtp.h,这样本来在逻辑上也成立,但是另外一个问题又出现了:公>用数据结构webmail模块也得用的,那么它需要包含main.h,那么smtp模块和webmail模块同时包含了main.h头文件,而这两个模块是要共存在sniff模块里头的,晕,文>件重复包含,汗啊...想借鉴一下tcpdump的文件组织方式....makefile文件让我有点晕....$_$
在同宿舍的提醒下在网上找了一下重复包含的解决方案,用定义宏的方法处理完毕,然后又出现了奇怪的问题(具体怎么怪的忘了,因为中间的怪错误太多了)又是multiple definition,又是undefined reference,晕@_@,确实刚开始应该好好确立一下程序的架构的,不然不会这么晕呼呼的了
静下心,认真想了一下,仔细的分析了程序模块之间调用的关系以及gcc编译的特性,确定如果要解决整个问题,需要很好的解决中间各个模块的依赖性问题,之所以出>现混乱的模块之间的耦合,是由于数据与函数功能没有明确的分开,以及全局变量和各个模块接口没有处理好关系,因此我按照这个思路先把包含的系统头文件和通用的数据结构(ip头结构等)拿出来放在一个单独的文件里,在各个模块里头就可以直接调用它而不与上层的调用函数有关,解决循环包含的问题,然后,将各个模块单独>编译,而在主控程序中只用到其中的接口,解决一些函数调用性的问题,终于成功重组了程序,并且自己对程序的逻辑把握更清晰
最后工程的程序文件如下:Sniff.h,Sniff.c,WebMail.h,WebMail.c,Smtp.h,Smtp.c,main.h,main.c,DLib.h(通用数据结构及包含头文件),FuncLib.h,FuncLib.c(通>用函数)
makefile文件内容:
--------------------------
OBJS=FuncLib.o main.o Sniff.o Smtp.o
FLAG=-lpcap -O2
CC=gcc
MyProg=Sniffer
                                                                                                                                              
$(MyProg):$(OBJS)
        $(CC) $(FLAG) $^ -o $@
FuncLib.o:FuncLib.c DLib.h FuncLib.h
        $(CC) -c $< -o $@
Smtp.o:Smtp.c
        $(CC) -c $< -o $@
Sniff.o:Sniff.c
        $(CC) -c $< -o $@
main.o:main.c main.h
        $(CC) -c $< -o $@
clean:
        rm -f *.o
        rm -f *.*~
        rm -f *~
--------------------------
                                                                                                                                              
后记:在做一个工程之前确实应该好好思考一下程序的整个结构,各个模块的设计,以及各个模块之间的关系,与主控模块之间的关系等等,而一些技术性问题也许在一个好的设计里头也会变得不算什么了,而且当你习惯了这样设计程序以后,也许真的就爱上它了:)
                                                                                                                                              
PS:中间遇到的一些技术性问题,算是给自己以后提个醒吧T_T
1.文件重复包含性问题(一般为头文件):
在文件的首尾两端加上:
#ifndef _FILENAME_H
#define _FILENAME_H
.......
......
程序代码
......
......
#endif
2.文件循环包含问题:
重新设计架构吧,最好将数据,功能函数,和主控函数分离
3.multiple definition问题:
问题特征如下:
***.o(.rodata+0x0): multiple definition of `***'
***.o(.rodata+0x0): first defined here
检查一下你的全局变量,常数型变量的位置问题,尤其是char *="*******"(我的问题就是-_-!),注意一下位置吧,最好换个地吧^_^

MEF程序设计指南九:重组(Recomposition)MEF部件

通过前篇八篇程序设计指南的学习,相信大家都知道应用程序部件的组合都是在初始化的时候进行装配的。如果当应用程序已经初始化完成了,此时又有新的部件被导入且进行装配,按照目前的实现方式就无法实现了,我们需要...

《当程序员的那些狗日日子》(十三)重组程序

几个星期后,我已将网站论坛系统的细节问题处理好,网站论坛系统也终于可以摆上线了。看到我自己竟然也能做出一个相对完整的论坛系统,我心里感到很欣慰和兴奋,并有几分成就感。虽然这个网站论坛系统放到整个互联网...
  • tangtdd
  • tangtdd
  • 2011年05月02日 18:56
  • 10115

MEF程序设计指南九:重组(Recomposition)MEF部件

通过前篇八篇程序设计指南的学习,相信大家都知道应用程序部件的组合都是在初始化的时候进行装配的。如果当应用程序已经初始化完成了,此时又有新的部件被导入且进行装配,按照目前的实现方式就无法实现了,我们需要...

《重构》 — Delphi示例:影片出租店程序(3、重构——分解并重组Statement)

示例:影片出租店程序(重构——分解并重组Statement) 步骤: 1、提炼“金额计算”代码 1.1、提炼“逻辑泥团”——“提炼方法(Extract Method)” ...

《重构》 — Java示例:影片出租店程序(3、重构——分解并重组Statement)

示例:影片出租店程序(重构——分解并重组Statement) 步骤: 1、提炼“金额计算”代码 1.1、提炼“逻辑泥团”——“提炼方法(Extract Method)” ...

c语言程序设计车厢重组

  • 2014年04月03日 11:24
  • 346B
  • 下载

一次Linux服务器被入侵和删除木马程序的经历

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wzlinux.blog.51cto.com/8021085/1740113 ...

一次Linux服务器被入侵和删除木马程序的经历

本文出自 “小小水滴” 博客,请务必保留此出处http://wangzan18.blog.51cto.com/8021085/1740113一、背景    晚上看到有台服务器流量跑的很高,明显和平常不...

一次Linux服务器被入侵和删除木马程序的经历

一、背景     晚上看到有台服务器流量跑的很高,明显和平常不一样,流量达到了800Mbps,第一感觉应该是中木马了,被人当做肉鸡了,在大量发包。     我们的服务器为了最好性能,防火墙...

记录一次并未读源码调试程序的经历

在IPOL当了一个畸变校正的程序,师兄说在LINUX上运行配置文件比较简单,于是就安装了虚拟机,个人感觉自己是新手,在LINUX下调试程序可能对程序的底层算法有一定的了解,但是对于注重算法本身而非代码...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一次重组程序的经历
举报原因:
原因补充:

(最多只允许输入30个字)