Chinaunix首页 | 论坛 | 博客
  • 博客访问: 314284
  • 博文数量: 111
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 117
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-01 16:16
个人简介

作为一个新手,只能说,多学多看!

文章分类
文章存档

2017年(2)

2015年(109)

我的朋友

分类: LINUX

2015-04-23 16:48:41

总结iperf,自然最重要的是它的工作流程,这里是以1.7版本为例(也因为它比较繁琐,有东西讲^_^),主要还是写给自己看的,新手入门,亲,别打脸。
        看一个软件的源代码,毫无疑问,得从main函数开始看起,它是程序进入的入口,也是将会执行的全部。
        main函数的源代码和详解在我转载的iperf详解里面都有,这里都不再赘述,只是我觉得原文作者似乎没有当老师的天赋,讲述的内容零散且无序,所以稍微补充,讲一下我阅读源码的一些收获。
        从main函数可以明确看到,在初始化并将环境和命令行变量填入结构体之后,会根据用户输入判断生成 Listener类还是Speaker类的对象,然后调用对应类的start方法。
       由于C++的继承关系,且这两个Thread类的派生类并没有重写start方法,所以会调用Thread类当中的start方法,而start方法又会调用其中的Run_Wrapper方法,这些都是Thread类中实现的,将一些线程都要做的事完成,尽量实现代码的重用(这也是C++的好处),但是Run_Wrapper中会调用纯虚函数run,这个方法会被各个派生类重写,用来干各自的事情。
       listener类中的run方法,就会生成一个Audience的类对象,然后start(同样是继承Thread),并在audience的构造方法中生成server类对象,并start。
       在server中,又分为tcp和udp的数据传输形式,进入其中,就是接收数据和计算带宽的核心啦。
       Speaker大致如是。
       构造方法会先执行基类的构造方法,而析构函数则相反,所以,当你发现一个变量不知道在什么时候初始化的话,不妨去基类的构造函数里面看看,会有意外收获也不一定呢。
       所以说,在阅读C++代码的时候,除了跟着流程走,还得注意继承和派生关系,很容易就晕了,果然还是大爱C......
      
       1.7的代码可优化的地方相当多,在2.0.5版本中,就去除了毫无意义的繁琐的继承派生关系还有简化一些步骤,简单明了,
       比如,听者结束之后的回写,说者结束之后的听......
       像我一样的菜鸟建议去看2.0.5版本......

阅读(2283) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~