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命令进行搜索,但这是必经之路
另外,推荐SourceInsight,这实在是个看源码的绝好工具。
6.尝试去修改和抄写代码
你是否理解代码有个很简单的衡量尺度,那就是,如果你能很轻易地修改它并且好无错误,你必然很深刻地理解了这段代码,否则只是纸上谈兵而已,这正如看书,如果你无法对别人复述书的内容,那我也不相信你很好地理解了这本书的精髓
将你暂时难以理解的部分代码原样在电脑中敲打一遍也不失为一种好方式,这正如古人抄书一般。我当初也是把Peercast的核心代码重新实现了一遍才真正理解了Peercast的执行流程的。
7.将难以理解的代码打印出来,找一个安静的地方仔细研究
我们在电脑前总是容易丧失缜密思考的能力,所以你需要的是一个安静的地方好好思考
哈哈,图书馆绝对是个好地方,是个去了就想学习和思考的好地方
没有合适的资源?快使用搜索试试~ 我知道了~
peercast源码
共292个文件
html:110个
h:40个
cpp:33个
5星 · 超过95%的资源 需积分: 9 59 下载量 56 浏览量
2009-11-27
23:19:17
上传
评论 1
收藏 1.21MB RAR 举报
温馨提示
这是一份peercast的源码,带有详细注释,希望对大家有所帮助
资源推荐
资源详情
资源评论
收起资源包目录
peercast源码 (292个子文件)
SCRIPT1.APS 18KB
Simple.aps 14KB
6F535B359B479DF8B114E420DF7B3ECC.asx 132B
634F445C6F4160F85F7829954FFA5713.asx 132B
peercast.bmp 118KB
TRAYCTL.C 5KB
SYSTRAY.C 781B
channel.cpp 79KB
servhtml.cpp 63KB
servent.cpp 61KB
servmgr.cpp 53KB
jis.cpp 49KB
servhs.cpp 40KB
Simple.cpp 26KB
sys.cpp 18KB
pcp.cpp 18KB
TRAYCTL.CPP 17KB
gui.cpp 17KB
gnutella.cpp 16KB
ogg.cpp 11KB
wsocket.cpp 11KB
usocket.cpp 10KB
html.cpp 10KB
xml.cpp 10KB
url.cpp 8KB
stream.cpp 7KB
peercast.cpp 5KB
usys.cpp 4KB
http.cpp 4KB
mms.cpp 4KB
inifile.cpp 4KB
wsys.cpp 3KB
stats.cpp 3KB
html-xml.cpp 2KB
mp3.cpp 2KB
nsv.cpp 2KB
socket.cpp 959B
rtsp.cpp 810B
icy.cpp 616B
StdAfx.cpp 286B
stylesheet.css 2KB
peercast.css 618B
peercast.css 618B
peercast.css 618B
peercast.css 618B
peercast.css 618B
peercast.css 618B
peercast.css 618B
peercast.css 618B
peercast.css 618B
peercast.css 618B
Thumbs.db 10KB
Thumbs.db 5KB
Thumbs.db 5KB
corelib.dep 10KB
Simple.dep 2KB
winamp2.dep 698B
~$代码修改情况.docx 162B
corelib.dsp 15KB
Simple.dsp 11KB
winamp2.dsp 5KB
PeerCast.dsw 2KB
winamp2.dsw 836B
corelib.dsw 537B
oggcap.exe 1.12MB
PeerCast.exe 376KB
PeerCast.exe 376KB
play2.gif 1KB
speaker.gif 1KB
small-icon.gif 150B
smallicon.gif 150B
channel.h 13KB
pcp.h 9KB
sys.h 9KB
servmgr.h 8KB
common.h 7KB
stream.h 6KB
gnutella.h 6KB
servent.h 6KB
asf.h 6KB
http.h 5KB
resource.h 4KB
atom.h 4KB
cstream.h 4KB
ogg.h 3KB
resource.h 3KB
WINAMP~1.H 3KB
peercast.h 2KB
xml.h 2KB
html.h 2KB
stats.h 2KB
usocket.h 2KB
Simple.h 2KB
socket.h 2KB
wsys.h 2KB
usys.h 2KB
wsocket.h 2KB
inifile.h 1KB
version2.h 1KB
gui.h 1KB
共 292 条
- 1
- 2
- 3
资源评论
- yuki1234567892012-09-07不错的代码,可以好好分析
- truestudio2012-10-24非常不错的资源,而且还带了学习过程,解析得很详细。
- 花念雪2013-11-07很不错,各方面都很详细
- king_sgo2013-07-24很不错的资源,而且有很详细的分析资料。
- 铁蛋山竹2013-06-18不错,注释有帮组,对学习p2p代码和原理很不错的
superquill
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 359B-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 三菱PLC例程源码定長度裁端子机程序
- 355A-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 三菱PLC例程源码电子元件玻璃烘烤机PLC程序
- C#,图论与图算法,有向图(Directed Graph)的环(Cycle)的普通判断算法与源代码
- 351A-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 三菱PLC例程源码电子元件玻璃烘烤机
- C#,精巧实用的代码,图片像素(Bitmap Pixel)的读取与绘制的快速方法与源程序
- 351AN-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- C#,图论与图算法,图最短路径的迪杰斯特拉(Dijkstra)算法与源代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功