首页 > 代码库 > 电驴 emule 源码分析 (1)

电驴 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
     真真的把数据发送出去。