关于电驴emule 的源代码,网上有一个  叫刘刚的人 分析的 非常多,可是假设你仅仅是看别人的分析,自己没有亲身去阅读代码的话,恐怕非常难  剖析整个系统。

关于emule  主要就是 连接 kad网络部分, 搜索部分,共享部分,下载部分,还有就是IRC聊天部分。IRC聊天部分应该不是大多数人想知道的重点,核心部分  还是kad网络的构造 和 下载部分 的实现。

我看了下 搜索部分,大致的过程是下面酱紫。  希望有很多其它 学习emule源代码的人 一起交流共享。

0. 连接到Kad网络的过程

     程序猿初始化 CemuleApp::InitInstance(), 会开启定时器。

     大致过程:

           uploadqueue = new CUploadQueue();-------------> SetTimer(0,0,TIMER_PERIOD,UploadTimer)-------------->theApp.emuledlg->PostMessage(TM_DOTIMER, NULL, NULL)

     --------------->CemuleDlg::DoTimer--------->CUploadQueue::UploadTimer.





     当点击  kad网络的  connectbutton后 ,调用   CKademlia::Start 函数, 

     m_bRunning  成员会被 置为 true.

     当定时器 读到这个标志为 true, 则运行 Kademlia::CKademlia::Process()函数。

     再调用  CRoutingZone::OnBigTimer  --->  CSearchManager::FindNode函数 -----> CSearchManager::StartSearch

     ----------->CSearch::Go()------->CSearch::SendFindValue->CKademliaUDPListener::SendPacket发出KADEMLIA2_REQ包。





    发KADEMLIA2_REQ包 的过程中,须要从列表中找到 近期的联系人。

1. 运行加入kad文件的过程。

     读取kad列表CRoutingZone::ReadFile

     从文件里读取 kad节点的 数据。









  2. 运行搜索的过程。

    

     (1)  CClientUDPSocket::SendPacket  把发送数据放入到队列中。

     整个具体过程是这样子:

         

        点击搜索button----> CSearchResultsWnd::StartSearch----->CSearchResultsWnd::StartNewSearch------>CSearchResultsWnd::DoNewKadSearch

     ------->Kademlia::CSearchManager::PrepareFindKeywords()------------->CSearch::Go()---->CSearch::SendFindValue----> CKademliaUDPListener::SendPacket

     ------->CClientUDPSocket::SendPacket----------->controlpacket_queue.AddTail.

      <===================================================================================================================================================

       这条数据包是 KADEMLIA2_REQ, 也就是说 对方会回复 KADEMLIA2_RES.当对方 回复KADEMLIA2_RES后  会依据是谁

      发的 KADEMLIA2_REQ来决定是否调用 CSearch::ProcessResponse, 将m_mapResponded加入值。

       于是当 以下的定时器轮询的时候if (m_mapResponded.count(itContactMap->first) > 0) 条件才会成立。接着调用CSearch::StorePacket

      <===================================================================================================================================================

        





     (2)  定时器轮询:

        CKademlia::Process()----->  CSearchManager::JumpStart()------->CSearch::JumpStart------>CSearch::StorePacket

    ----------------->CKademlia::GetUDPListener()->SendPacket(&m_pfileSearchTerms, KADEMLIA2_SEARCH_KEY_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort(), pFromContact->GetUDPKey(), &uClientID);

    ----------------->CClientUDPSocket::SendPacket----------->controlpacket_queue.AddTail.

     这个过程发出一个真真的搜索请求。

    

     (3) 处理搜索结果:

        CKademliaUDPListener::Process_KADEMLIA2_SEARCH_RES() ----> CSearch::ProcessResult() ------>  

      

      (4) 发送数据的过程

     开启线程 UploadBandwidthThrottler::RunInternal  ---> CClientUDPSocket::SendControlData  ---> CClientUDPSocket::SendTo ---->CAsyncSocket::SendTo

     真真的把数据发送出去。

对于程序猿来说,“高手”和“菜鸟”之间的差别实际上仅仅有两个因素:一是从事编程时间的长短不同,使经验的多少有所差别;第二个因素就是手头掌握资料的多少了,由于非常多问题并非靠自己钻研能够解决的,必须靠资料,试想在写DOS汇编程序时假设没有中断手冊,能够自己钻研出来吗?实际上,大部分“菜鸟”向“高手”问的问题全然能够由參考资料解决,即使一个“菜鸟”对某个问题临时不懂,但手头有解决这个问题的具体资料,经过一段时间的钻研,问题自然会解决。“高手”就是这样慢慢练成的。

电驴 emule 源代码分析 (1)的更多相关文章

  1. 开源一款资源分享与下载工具 —— 电驴(eMule)

    这里分享一款资源分享与下载工具--电驴,其实严格来说,应该叫电骡,这是我维护的版本,eMuleVeryCD版本,VeryCD是一个不错的资源分享网站:http://www.verycd.com/.大概 ...

  2. 常用下载方式的区别-BT下载、磁力链接、电驴

    出处:https://www.jianshu.com/p/72b7a64e5be1 打开 115 离线下载的窗口,看到支持这么多种链接,你都清楚他们是什么原理嘛?接下来我们一个一个说. 一.HTTP( ...

  3. Java生鲜电商平台-电商促销业务分析设计与系统架构

    Java生鲜电商平台-电商促销业务分析设计与系统架构 说明:Java开源生鲜电商平台-电商促销业务分析设计与系统架构,列举的是常见的促销场景与源代码下载 左侧为享受促销的资格,常见为这三种: 首单 大 ...

  4. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

  5. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

  6. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  7. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

  8. 转:ffdshow 源代码分析

    ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...

  9. UiAutomator源代码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...

随机推荐

  1. Objective-C开发编码规范:4大方面解决开发中的规范性问题

    Objective-C 编码规范,内容来自苹果.谷歌的文档翻译,自己的编码经验和对其它资料的总结. 概要 Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程 ...

  2. oracle常见问题

    1.无效的月份,一个可能是字符集的问题, alter session set nls_language=american alter session set nls_language='SIMPLIF ...

  3. Python监控网站运行状况

    利用python便捷的类库,可以方便快速实现对网站运行状况的监控,主要包括对80端口(即网站运行端口),其它tcp服务等端口的监控就可以了解服务器大概的一个运行状况,使用的库主要为urllib2及so ...

  4. JVM--Garbage First

    Garbage First Garbage First 简称 G1,它的目标是要做到尽量减少 GC 所导致的应用暂停的时间,让应用达到准实时的效果,同时保持 JVM 堆空间的利用率,其最大的特色在于允 ...

  5. Python函数式编程:内置函数reduce 使用说明

    一.概述 reduce操作是函数式编程中的重要技术之一,其作用是通过对一个集合的操作,可以从中生成一个值.比如最常见的求和,求最大值.最小值等都是reduce操作的典型例子.python通过内置red ...

  6. 杭电--1862--EXCEL排序--结构体排序

    EXCEL排序 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  7. Android Activity Fragment 生命周期

    从开源项目中看到 这个,就情不自禁的收藏了~ https://github.com/xxv/android-lifecycle

  8. GREENPLUM简单介绍

    原帖:http://www.itpub.net/thread-1409964-1-1.html 什么是GREENPLUM? 对于非常多IT人来说GREENPLUM是个陌生的名字.简单的说它就是一个与O ...

  9. CentOS下Samba文件服务器的安装与配置

    CentOS下Samba文件服务器的安装与配置 http://blog.csdn.net/limingzhong198/article/details/22064801 一.安装配置 1. 安装sam ...

  10. powerMock比easyMock和Mockito更强大(转)

    powerMock是基于easyMock或Mockito扩展出来的增强版本,所以powerMock分两种类型,如果你习惯于使用easyMock的,那你就下载基于easyMock的powerMock,反 ...