关于电驴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网络的  connect按钮后 ,调用   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  把发送数据放入到队列中。
     整个详细过程是这样子:
         
        点击搜索按钮----> 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(电驴/电骡)源码分析

    void CUpDownClient::ConnectionEstablished(): emule中, CUpDownClient 代表了一个peer.一个peer会被放置到各种队列中去.比如,还未 ...

  2. ed2k 网络中搜索资源并选择资源下载的分析及eMule源码梳理

    上一篇博客中,客户端已连接到ed2k网络及客户端与服务器交互的eMule源码梳理,这里将开始搜索资源并下载及客户端与客户端交互的eMule源码梳理 emule 源码下载地址  http://downl ...

  3. TeamTalk源码分析(十一) —— pc客户端源码分析

           --写在前面的话  在要不要写这篇文章的纠结中挣扎了好久,就我个人而已,我接触windows编程,已经六七个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究windows程序上 ...

  4. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

  5. FPGA学习之路—接口(3)—SPI详解及Verilog源码分析

    FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...

  6. FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析

    FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...

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

    回顾 上一篇请移步:zrender源码分析1:总体结构 本篇进行ZRender的MVC结构中的M进行分析 总体理解 上篇说到,Storage负责MVC层中的Model,也就是模型,对于zrender来 ...

  8. 【作者面对面问答】包邮送《Redis 5设计与源码分析》5本

    墨墨导读:本文节选自<Redis 5设计与源码分析>,主要为读者分析Redis高性能内幕,重点从源码层次讲解了Redis事件模型,网络IO事件重在使用IO复用模型,时间事件重在限制最大执行 ...

  9. (连载)Android系统源码分析--Android系统启动流程之Linux内核

    > **这是一个连载的博文系列,我将持续为大家提供尽可能透彻的Android源码分析 [github连载地址](https://github.com/foxleezh/AOSP/issues/3 ...

最新文章

  1. WebGL光栅化流水线
  2. OpenCascade Primitives BRep-Cylinder
  3. @ngrx入坑angular的schema,爽的一逼!
  4. visual studio 代码提示_《微软模拟飞行2020》代码暗示下一代Xbox或支持VR
  5. happens-before规则和as-if-serial语义
  6. java圆形进度条_可拖拽圆形进度条组件(支持移动端)
  7. 随想录(用好红黑树)
  8. python操作数据库的几种方法_python对mysql数据库操作的三种不同方式
  9. 播放量子计算机的声音,首次实现:用声音纠缠了两个量子比特!
  10. (转) oracle清空数据库脚本
  11. comsol兼容服务器系统,comsol 云服务器
  12. Call Center核心词汇含义及功能
  13. oracle gbk 转码,oracle编码格式从utf-8转换为GBK
  14. Andorid微信刷脸支付使用过程解析
  15. win10自动修复失败无限循环_windows自动修复失败,无法启动
  16. 如何将逻辑地址转换成物理地址
  17. Pro_07丨波动率因子3.0与斜率因子
  18. 基于STM32的电机--电机概述
  19. 门禁接入动环系统,门磁接入动环系统怎么设置
  20. gnocchi-采样数据存储流程分析(002)--数据的异步统计

热门文章

  1. 网红RGB镜子灯触摸芯片-DLT8S15B-杰力科创
  2. ls一1测距仪说明书_杜克 LS-P激光测距仪开箱及上手体验
  3. vs setup project , 卡死 正在做准备安装
  4. 计算机ucs汉字编码,字符编码基础知识 - Unicode,UCS,GBK,GB2312,UTF-8
  5. 两种基本计算机体系结构_照片_哈佛与冯诺依曼体系结构
  6. jvm中GC日志格式详解(十)
  7. 文件上传在Struts的Action检测文件类型
  8. 腾讯T3大牛亲自教你!这么香的技术还不快点学起来,书籍+视频+学习笔记+技能提升资源库
  9. Vue Cli4 使用高德地图定位 获取当前经纬度信息以及周边定位
  10. 服务器维护后稀有,6月28日更新维护公告 言灵大人福袋、稀有姜小萌福袋限时上架!...