轉載自:
主體結構:(按照下面的呼叫順序啟動主要流程)
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...