电驴 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網絡的 ?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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DataTable 插件 Uncaugh
- 下一篇: emule 搜索出现假文件