电驴 emule 源码分析 (1)

关于电驴emule 的源码,网上有一个  叫刘刚的人 分析的 很多,但是如果你只是看别人的分析,自己没有亲身去阅读代码的话,恐怕很难  剖析整个系统。

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

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

1. 执行添加kad文件的过程。

读取kad列表CRoutingZone::ReadFile

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

2. 执行搜索的过程。

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

整个详细过程是这样子:

点击搜索按钮----> 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

真真的把数据发送出去。

电驴 emule 源码分析 (1)

时间: 2024-10-13 07:22:36

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

Volley源码分析

Volley源码分析 Volley简介 volley官方地址 在Google I/0 2013中发布了Volley.Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. 这是Volley名称的由来:a burst or emission of many things or a large amount at once.Volley特别适合数据量不大但是通信频繁的场景. Github上面已经有大神做了镜像,使用Gradle更方便.Volley On Github Vo

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte

ZRender源码分析2:Storage(Model层)

回顾 上一篇请移步:zrender源码分析1:总体结构 本篇进行ZRender的MVC结构中的M进行分析 总体理解 上篇说到,Storage负责MVC层中的Model,也就是模型,对于zrender来说,这个model就是shape对象,在1.x表现的还不强烈,到了2.x, 在zr.addShape()的时候,传入的参数就必须是new出来的对象了详情请看这里 2.x相比1.x的变化,关于这个变化多说点吧,那就是从1.x升级到2.x的时候,因为方式变了,总不能改掉所有的代码,总不能像ext一样,

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

jquery源码分析之一前言篇

1.问:jquery源码分析的版本是什么? 答:v3.2.1 2.问:为什么要分析jquery源码? 答:javascript是一切js框架的基础,jquery.es6.vue.angular.react.redux,node.只有完全掌握原生js,你才能快速理解各种js框架,也是你达到高级程序员的必经之路.记得我刚来东航电商工作的时候,一位高级程序员跟我说过,中级前端就是往上走,学习掌握各种流行js框架,但是想往高级走,我们得往下走,对于底层语言的熟悉,懂得它的思想才能在程序领悟拥有创造力,只

TeamTalk源码分析之login_server

login_server是TeamTalk的登录服务器,负责分配一个负载较小的MsgServer给客户端使用,按照新版TeamTalk完整部署教程来配置的话,login_server的服务端口就是8080,客户端登录服务器地址配置如下(这里是win版本客户端): 1.login_server启动流程 login_server的启动是从login_server.cpp中的main函数开始的,login_server.cpp所在工程路径为server\src\login_server.下表是logi

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

HashMap与TreeMap源码分析

1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Java这么久,也写过一些小项目,也使用过TreeMap无数次,但到现在才明白它的实现原理).因此本着"不要重复造轮子"的思想,就用这篇博客来记录分析TreeMap源码的过程,也顺便瞅一瞅HashMap. 2. 继承结构 (1) 继承结构 下面是HashMap与TreeMap的继承结构: pu

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线