ok

Peercast源代码是我第一次看超过2万行的代码,在这期间收获很大,也积累了一些经验。Peercast源代码是我第一次看超过2万行的代码,
在这期间收获很大,也积累了一些经验,在此与大家分享,希望为大家看源代码提供一些帮助和参考.

这里主要介绍的是在Visual Stdio6.0环境下,看Peercast的win32版本代码的一些经验


1.拿到源代码的第一个步骤是编译并运行,而且你首先要对如何使用它掌握得一清二楚
这是必不可少的步骤。一个无法编译并运行的源代码对你毫无任何帮助,而当你编译成功后,以后你修改代码的所有问题都是你的错。
要深刻理解代码显然要先理解代码产生的功能,所以你必须去运行它,先会用才能进一步掌握它的内部运行机制

所以,拿到Peercast源码后,我希望你先弄清楚如何编译即编译的步骤,这我在《源代码编译方法》已经给出
你所要做的就是先将其编译一遍从而确认没有错误
然后掌握Peercast的运行方法,如何通过黄页收听广播电台、如何通过地址方式收听广播电台、如何广播MP3、WMV、ASF等文件,如何查看日志

和统计数据,这些都是不可忽略的步骤

2.理解整个系统是个拼图的过程
这正如拼图一般,刚开始你只是在小范围内试着拼,慢慢地你看出来整体的一些端倪,然后你不断地通过局部来理解整体,再从整体来理解局

部,最后拼成了最终的一幅完整的图
所以,面对庞大的代码千万不要灰心,只要你足够坚持,总能拼出那个完整的图案

刚开始我也是被Peercast代码所吓倒,繁杂的类和函数,实在不敢相信我什么时候才能够看完,而且根本不知从何看起
这里有几点建议:
1.当不知道从何看起时,从程序的起始点看起总是一个不错的手段,所以在看WIN32代码时,一般从WinMain看起
2.在看C++代码时,一般要先从各个类的定义看起,先弄清楚各个类是用来完成什么功能的,再去理清类与类之间的相互关系,当然刚开始你都

是在猜测,然后是验证
3.C++中往往是先通过几个类产生这个类的对象,然后由这些对象再创建出其他的对象。因此对于程序初始时创建的一些对象尤其是全局对象,

你必须特别注意,因为他们贯穿整个代码的始终,而且很有可能是串起整个代码的核心所在。没错,我想如果你注意到了这三个全局对象的话

,你就知道重点在哪了,它们是sys、chanMgr、servMgr,它们永远是我强调的重点。
4.看源代码是个反复的过程,甚而是个不断延伸的过程。例如要理解函数A()必须去查看B(),由于它调用了B(),而为了理解B()又必须去查看

C()的代码,这就必须要求你要清楚地知道你要理解的是什么,即使你看到了F(),在这个过程中你要始终知道你是为了理解函数A()的功能,千

要不要迷失在代码的海洋里,你要记得抓住重点。很多函数本身就是个黑匣子,例如WSys类,刚开始的时候你不必去理解它是如何实现的,只

须将其看成库来使用就可以了。
5.分清类库和核心类。Peercast的类库都是自己实现的,所以你必须仔细分清类库和核心类,核心类你要仔细研究,而类库只需关心它是如何

使用的即可。例如FileStream类,你只需知道FileStream::write()是用来实现向文件中写数据就可以了,至于其内部如何实现可以不去管它。

而向Servent类,你自然必须对它的各个函数的内部操作理解透彻。

总之,记着看代码的过程中要有一条主线,同时分清重点和次要点。

所以,看代码的步骤是:
概览全局->找出重点->理解重点->查看分支->理解全局
而这是一个迭代的过程,每个循环你都在向最终目标又靠近了一层

当你拼图时,如果你能大致看看整个拼图的样子,是否能为你提供很大的帮助呢?
没错,所以你需要大体地先浏览一下整个代码,弄清楚各个文件和各个类大体起什么作用(这些可以查看我的相应文章),对你将来代码的阅

读会提供很大的帮助。
猜测是个很不错的手段,尤其是在代码质量高命名清晰的情况下,你往往可以猜到这个类或函数是完成什么功能的
比如说你看到Channel类,你会猜想这个类应该是来完成频道的创建、删除工作的吧,没错,就是如此。
那么,多个频道是如何管理的呢?这时你注意到了ChanMgr类,ChanMgr,应该是Channel Manager的缩写吧,而且你甚至可以猜想到ChanMgr类

应该包含Channel的多个对象。
好了,剩下来你要做的事情就是去验证你的猜想是否准确了。

3.文档
文档绝对是个事半功倍的东西,所以你必须不惜任何代价去找到与这份代码相关的文档
Peercast没有文档,但有个好地方你不能不去,那就是Peercast的官方论坛,作者giles也在里面发言,我从他的发言里面学到了不少Peercast

的设计思想
所以我建议大家一定去www.peercast.org/forum看一下,不管是使用技巧还是编程版块,你总能找出自己需要的东西。在网上大量的信息面前

找到自己真正需要的文档是一项必备技能,我们需要一针见血。
另外用Peercast论坛的搜索功能查找giles的文章和你想了解的问题的关键字,这不失为一个好方法。

4.从日志文件着手是个看源代码的好方法
通常开源代码都会有比较详细的日志文件记录。通过查看日志文件,可以很清晰地理清源代码执行的流程,从而为理解源代码提供方便。
例如我想理解Peercast启动的代码流程:
其中日志文件如下:
SessionID: 002B372DA1F08103C65AA48DE4F28633
cmd: tip, arg: 202.205.16.102:7144"
allocated servent 1
allocated servent 2
Starting servers
Server started: 127.0.0.1:7144
Server started: 127.0.0.1:7145
Add hit: 202.205.16.102:7144/0.0.0.0:0
Searching for: 634F445C6F4160F85F7829954FFA5713 ()
New channel created

这样我在源代码中依次搜索SessionID:、cmd:、allocate servent、Starting servers字段
相应的执行函数岂不一目了然
bool ServMgr::start()
{
 char idStr[64];
 sessionID.toStr(idStr);
 LOG_DEBUG("SessionID: %s",idStr);
}

void ServMgr::procConnectArgs(char *str,ChanInfo &info)
{
 char arg[512];
 char curr[256];

 //使args等于?后面的字符串,即tip=211.132.83.9:7144
 char *args = strstr(str,"?");
 if (args)
  *args++=0;

 info.initNameID(str);

 if (args)
 {
  //nextCGIarg分解字符串,把"tip"保存到curr中,"211.132.83.9"保存到arg中
  while (args=nextCGIarg(args,curr,arg))
  {
   LOG_DEBUG("cmd: %s, arg: %s",curr,arg);
而且我也可以很清楚的看到LOG_DEBUG是用来输出日志文件用的,而ServMgr是个重要的类,可以用来提供初始化和连接等重要功能
这样我要研究Peercast代码,是不是可以从ServMgr着手呢,没错!

5.学会跨文件搜索是个很重要的手段
可以说跨文件搜索是阅读源代码的核心所在,我们想要查询某个函数或者理解函数之间的调用关系,跨文件搜索是必要的手段
如果是VC6.0环境则比较简单,只要选择Find in files菜单,然后选择好In folder即要查询的文件夹的路径即可
LINUX比较麻烦一点,要学会用grep命令进行搜索,但这是必经之路

6.拿到源代码的第一个步骤是编译并运行,而且你首先要对如何使用它掌握得一清二楚
这是必不可少的步骤。一个无法编译并运行的源代码对你毫无任何帮助,而当你编译成功后,以后你修改代码的所有问题都是你的错。
要深刻理解代码显然要先理解代码产生的功能,所以你必须去运行它,先会用才能进一步掌握它的内部运行机制

7.尝试去修改和抄写代码
你是否理解代码有个很简单的衡量尺度,那就是,如果你能很轻易地修改它并且好无错误,你必然很深刻地理解了这段代码,否则只是纸上谈
兵而已,这正如看书,如果你无法对别人复述书的内容,那我也不相信你很好地理解了这本书的精髓
将你暂时难以理解的部分代码原样在电脑中敲打一遍也不失为一种好方式,这正如古人抄书一般。

8.将难以理解的代码打印出来,找一个安静的地方仔细研究
我们在电脑前总是容易丧失缜密思考的能力,所以你需要的是一个安静的地方好好思考
哈哈,图书馆绝对是个好地方,是个去了就想学习和思考的好地方

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Peercast注释版是我在做本科毕业设计时分析Peercast的一些成果,当时阅读代码的时候做了注释,然后写了一些分析文章。本来想发到自己的博客上保留一份记录的,不想后来竟成了很多人参考Peercast的资料。这点上我是有些惭愧的,因为很多不成熟的想法和不正确的观点可能会误导大家,也希望大家能够分辨吧。本来想形成一份比较完整的注释版,但后来由于毕业以及转变研究方向等因素已经没有继续做下去了。不过核心的代码我想应该还是比较清晰的,大家可以参考一下。我把Peercast注释版发到CSDN的资源上,大家可以访问http://download.csdn.net/hicsdn/bbisonic进行下载,以后我就不回复索要代码的留言和邮件了。也是很抱歉,有半年的时间没更新过此BLOG了,对于有些我没注意到留言或邮件而漏发代码的朋友们,在此说声SORRY了。<br><br>大家在看代码前最好先看看Peercast源码分析文章,里面的<源码编译方法>可以告诉你如何编译Peercast源代码。<看源代码前必读>可以告诉你项目的组织结构以及各源码目录各自完成什么功能,可以让你对整体有个大概的了解。<Peercast整体架构分析>让你能大致了解一下Peercast的架构及设计思想。<阅读Peercast源码的一些经验>是我阅读Peercast源码的一些体会,希望对你能有所帮助。<Peercast服务器端代码执行流程>解释服务器启动的一些关键代码,<Peercast播放模块分析>解释Peercast如何调用播放器实现媒体播放的。以上是一些比较重要的文章,其他文章可以有选择性地看看。其他的话就看源码注释吧。<br><br>这份源码注释有很多不足之处,是我学习过程中的一个成果,大家请见谅。如果它能给你阅读 Peercast的过程中带来一些帮助的话,我将感到非常荣幸。<br>特此声明。<br><br>王浩聪<br>2007.12.11<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值