电驴 emule 源代码分析 (1)
关于电驴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)的更多相关文章
- 开源一款资源分享与下载工具 —— 电驴(eMule)
这里分享一款资源分享与下载工具--电驴,其实严格来说,应该叫电骡,这是我维护的版本,eMuleVeryCD版本,VeryCD是一个不错的资源分享网站:http://www.verycd.com/.大概 ...
- 常用下载方式的区别-BT下载、磁力链接、电驴
出处:https://www.jianshu.com/p/72b7a64e5be1 打开 115 离线下载的窗口,看到支持这么多种链接,你都清楚他们是什么原理嘛?接下来我们一个一个说. 一.HTTP( ...
- Java生鲜电商平台-电商促销业务分析设计与系统架构
Java生鲜电商平台-电商促销业务分析设计与系统架构 说明:Java开源生鲜电商平台-电商促销业务分析设计与系统架构,列举的是常见的促销场景与源代码下载 左侧为享受促销的资格,常见为这三种: 首单 大 ...
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
- 转:SDL2源代码分析
1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...
- 转:RTMPDump源代码分析
0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...
- 转:ffdshow 源代码分析
ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...
- UiAutomator源代码分析之UiAutomatorBridge框架
上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...
随机推荐
- D.6661 - Equal Sum Sets
Equal Sum Sets Let us consider sets of positive integers less than or equal to n. Note that all elem ...
- 网络编程(UDP协议-聊天程序)
网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...
- html向servlet传乱码解决办法
html 设置为utf-8格式 <meta http-equiv="content-type" content="text/html;charset=UTF-8&q ...
- 一年四个P(Project)
盼望着,盼望着,提高班众多革命同胞的假期终于来了.伴随着校园之中越来越多的同学身影,暑假学习时的那份静谧一散而去,恍然间在提高班学习的第二个年头也已经过去了(~_~),而自己的大学生涯也就像秋后的蚂蚱 ...
- 以xml的方式实现动画
1.java代码 package com.example.tweenanim; import android.os.Bundle; import android.app.Activity; impor ...
- ACM第三次比赛UVA11877 The Coco-Cola Store
Once upon a time, there is a special coco-cola store. If you return three empty bottles to the sho ...
- Can't connect to MySQL server on 'XXX' (13)
出现can't connect to MySQL server using '' (13)的错误,结果是 SELinux 不让 httpd 访问外网,一开始还以为是iptables造成的,关闭之后发现 ...
- 再写KMP算法
#include<iostream> #include<string> using namespace std; void getNext(char const*T,int l ...
- 几种能在O(n*log(n))时间排序
线性时间排序 各种排序算法总结已经介绍了几种能在O(n*log(n))时间内培训n个数的算法.归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.这些算法都有一个有趣的性质:在 ...
- JVM参数说明(转)
做了这么多年java,自以为算是熟悉,其实还差得远,啥也别说了,还是踏踏实实地学吧.今天总结一下常用的JVM的启动参数. 参数类别 参数项 说明 标准参数(-,所有的JVM实现都必须实现这些参数的功能 ...