eMule原始碼主要呼叫流程分析

2021-08-23 15:11:53 字數 2605 閱讀 3472

轉載自:

主體結構:(按照下面的呼叫順序啟動主要流程)

1.emule對話方塊類cemuledlg::oninitdlg ::settimer(null, null, 300, startuptimer) 設定啟動定時器;

2. 定時器函式void callback cemuledlg::startuptimer(。。)完成各物件初始化初始化伺服器列表

tagcount;}+tag ( 標籤)和從文字檔案讀取靜態server列表;

>create()

>onbnclickedbutton2();

7. 呼叫connectserver物件的trytoconnectanyserver()連線全域性伺服器。

1。csearchresultswnd::onbnclickeddownloadselected()-->csearchresultswnd::downloadselected(bool bpaused --

();..}cuploadqueue::cuploadqueue() //建構函式設的 的 置定時器100毫秒

3。進入 cupdownclient ::trytoconnect()--

>cupdownclient::connectionestablished()

op_acceptuploadreqcuploadqueue::addupnextclient(lpctstr pszreason, cupdownclient* directadd)第乙個引數說明了每次

呼叫該函式增加客戶端上傳的原因(即從上傳等待佇列放入正在上傳的佇列。// tell the client that we are now ready to

upload if (!newclient->socket || !newclient->socket->isconnected()) else void cuploadqueue::process() 每100毫秒呼叫一次 if

(forcenewclient())cur_client-

>sendblockdata();

6. 傳送peer請求的資料塊cupdownclient::connectionestablished() case us_connecting: case

packet* packet = new packet(op_acceptuploadreq,0); socket->sendpacket(packet,true); })檔案正式開始下

載是接收到op_acceptuploadreq訊息開始,case op_acceptuploadreq:client->processacceptupload

();cupdownclient::processacceptupload()-->cupdownclient::startdownload()-->cupdownclient::sendblockrequests()

網路層相關類:

class cemsocketvirtual bool packetreceived(packet* packet) = 0; protected處理接收到的網路資料報,被定義為純虛函

數,各網路相關類由lass cemsocket派生,各自對收到的包的處理不同。該函式在onreceive中被呼叫onreceive同樣為虛函式

class clistensocket 負責每個客戶端監聽乙個tcp埠,每接受乙個其他客戶端tcp連線就建立乙個cclientreqsocket物件,來

處理對應的客戶端傳送的相關訊息。cupdownclient 試圖連線其他客戶端的時候也會建立乙個cclientreqsocket的物件以連線到

其他peercemsocket::onsend(int nerrorcode){;if(m_currentpacket_is_controlpacket) { // queue up for

傳送的資料報分兩種受控和標準, 受控資料報優先順序較高sendpacket() 將資料報推向受控佇列,並且相關soket物件指標加入流

量控制物件中,最終由流量控制類通過指標呼叫socket物件的send函式傳送網路資料, if (controlpacket) {

controlpacket_queue.addtail(packet); // queue up for controlpacket

標準資料報被推往標準佇列中cserverconnect類主要功能,維護和檔案伺服器的聯接。

流量控制相關類uploadbandwidththrottler uploadbandwidththrottler 全域性有乙個該物件,傳送的資料報

uploadbandwidththrottler();在建構函式中啟動資料報傳送控制的執行緒afxbeginthread(runproc, (lpvoidthis);

uploadbandwidththrottler::runinternal(){socket->sendcontroldata( 傳送送控資料報socket-

>sendfileandcontroldata(傳送標準資料報cclientreqsocket 負責建立和其他客戶端的tcp連線 ,監聽其他客戶端請求訊息

afxbeginthread(runtime_class(caichsyncthread), thread_priority_below_normal,0);

emule(電驢 電騾)原始碼分析

void cupdownclient connectionestablished emule中,cupdownclient 代表了乙個peer。乙個peer會被放置到各種佇列中去。比如,還未連線的peer被放入到待連線佇列中。其它佇列中儲存的是peer的指標,這樣可以節省記憶體。函式connecti...

emule(電驢 電騾)原始碼分析

void cupdownclient connectionestablished emule中,cupdownclient 代表了乙個peer。乙個peer會被放置到各種佇列中去。比如,還未連線的peer被放入到待連線佇列中。其它佇列中儲存的是peer的指標,這樣可以節省記憶體。函式connecti...

emule(電驢 電騾)原始碼分析

void cupdownclient connectionestablished emule中,cupdownclient 代表了乙個peer。乙個peer會被放置到各種佇列中去。比如,還未連線的peer被放入到待連線佇列中。其它佇列中儲存的是peer的指標,這樣可以節省記憶體。函式connecti...