日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

电驴 emule 源码分析 (1)

發(fā)布時(shí)間:2024/3/24 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 电驴 emule 源码分析 (1) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ?關(guān)于電驢emule 的源碼,網(wǎng)上有一個(gè) ?叫劉剛的人 分析的 很多,但是如果你只是看別人的分析,自己沒有親身去閱讀代碼的話,恐怕很難 ?剖析整個(gè)系統(tǒng)。

? ? ?關(guān)于emule ?主要就是 連接 kad網(wǎng)絡(luò)部分, 搜索部分,共享部分,下載部分,還有就是IRC聊天部分。IRC聊天部分應(yīng)該不是大多數(shù)人想知道的重點(diǎn),核心部分 ?還是kad網(wǎng)絡(luò)的構(gòu)造 和 下載部分 的實(shí)現(xiàn)。?

? ? ?我看了下 搜索部分,大致的過程是以下醬紫。 ?希望有更多 學(xué)習(xí)emule源碼的人 一起交流共享。


? ? ??0. 連接到Kad網(wǎng)絡(luò)的過程
? ? ?程序員初始化 CemuleApp::InitInstance(), 會(huì)開啟定時(shí)器。
? ? ?大致過程:
? ? ? ? ? ?uploadqueue = new CUploadQueue();-------------> SetTimer(0,0,TIMER_PERIOD,UploadTimer)-------------->theApp.emuledlg->PostMessage(TM_DOTIMER, NULL, NULL)
? ? ?--------------->CemuleDlg::DoTimer--------->CUploadQueue::UploadTimer.


? ? ?當(dāng)點(diǎn)擊 ?kad網(wǎng)絡(luò)的 ?connect按鈕后 ,調(diào)用 ? CKademlia::Start 函數(shù),?
? ? ?m_bRunning ?成員會(huì)被 置為 true.
? ? ?當(dāng)定時(shí)器 讀到這個(gè)標(biāo)志為 true, 則執(zhí)行 Kademlia::CKademlia::Process()函數(shù)。
? ? ?再調(diào)用 ?CRoutingZone::OnBigTimer ?---> ?CSearchManager::FindNode函數(shù) -----> CSearchManager::StartSearch
? ? ?----------->CSearch::Go()------->CSearch::SendFindValue->CKademliaUDPListener::SendPacket發(fā)出KADEMLIA2_REQ包。


? ? 發(fā)KADEMLIA2_REQ包 的過程中,需要從列表中找到 最近的聯(lián)系人。?
? ?


? ?

? ? ? ? ???1. 執(zhí)行添加kad文件的過程。
? ? ?讀取kad列表CRoutingZone::ReadFile
? ? ?從文件中讀取 kad節(jié)點(diǎn)的 數(shù)據(jù)。




? 2. 執(zhí)行搜索的過程。
? ??
? ? ?(1) ?CClientUDPSocket::SendPacket ?把發(fā)送數(shù)據(jù)放入到隊(duì)列中。
? ? ?整個(gè)詳細(xì)過程是這樣子:
? ? ? ? ?
? ? ? ? 點(diǎn)擊搜索按鈕----> CSearchResultsWnd::StartSearch----->CSearchResultsWnd::StartNewSearch------>CSearchResultsWnd::DoNewKadSearch
? ? ?------->Kademlia::CSearchManager::PrepareFindKeywords()------------->CSearch::Go()---->CSearch::SendFindValue----> CKademliaUDPListener::SendPacket
? ? ?------->CClientUDPSocket::SendPacket----------->controlpacket_queue.AddTail.
? ? ? <===================================================================================================================================================
? ? ? ?這條數(shù)據(jù)包是 KADEMLIA2_REQ, 也就是說 對(duì)方會(huì)回復(fù) KADEMLIA2_RES.當(dāng)對(duì)方 回復(fù)KADEMLIA2_RES后 ?會(huì)根據(jù)是誰
? ? ? 發(fā)的 KADEMLIA2_REQ來決定是否調(diào)用 CSearch::ProcessResponse, 將m_mapResponded添加值。
? ? ? ?于是當(dāng) 下面的定時(shí)器輪詢的時(shí)候if (m_mapResponded.count(itContactMap->first) > 0) 條件才會(huì)成立。接著調(diào)用CSearch::StorePacket
? ? ? <===================================================================================================================================================
? ? ? ??


? ? ?(2) ?定時(shí)器輪詢:
? ? ? ? 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.
? ? ?這個(gè)過程發(fā)出一個(gè)真真的搜索請(qǐng)求。
? ??
? ? ?(3) 處理搜索結(jié)果:
? ? ? ? CKademliaUDPListener::Process_KADEMLIA2_SEARCH_RES() ----> CSearch::ProcessResult() ------> ?
? ? ??
? ? ? (4) 發(fā)送數(shù)據(jù)的過程
? ? ?開啟線程 UploadBandwidthThrottler::RunInternal ?---> CClientUDPSocket::SendControlData ?---> CClientUDPSocket::SendTo ---->CAsyncSocket::SendTo
? ? ?真真的把數(shù)據(jù)發(fā)送出去。



? ? ? ?對(duì)于程序員來說,“高手”和“菜鳥”之間的區(qū)別實(shí)際上只有兩個(gè)因素:一是從事編程時(shí)間的長(zhǎng)短不同,使經(jīng)驗(yàn)的多少有所區(qū)別;第二個(gè)因素就是手頭掌握資料的多少了,因?yàn)楹芏鄦栴}并不是靠自己鉆研可以解決的,必須靠資料,試想在寫DOS匯編程序時(shí)如果沒有中斷手冊(cè),可以自己鉆研出來嗎?實(shí)際上,大部分“菜鳥”向“高手”問的問題完全可以由參考資料解決,即使一個(gè)“菜鳥”對(duì)某個(gè)問題暫時(shí)不懂,但手頭有解決問題的詳細(xì)資料,經(jīng)過一段時(shí)間的鉆研,問題自然會(huì)解決。“高手”就是這樣慢慢練成的。

總結(jié)

以上是生活随笔為你收集整理的电驴 emule 源码分析 (1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。