日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开源项目之电驴emule

發(fā)布時間:2024/3/12 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源项目之电驴emule 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一款P2P文件共享軟件,電驢英文名eDonkey,它是一種檔案分享網(wǎng)絡(luò),最初用于共享音樂、電影和軟件。與多數(shù)文件共享網(wǎng)絡(luò)一樣,它是分布式的;文件基于點對點原理傳輸,而不是由中樞服務(wù)器提供。客戶端程序連接到ed2k網(wǎng)絡(luò)來共享文件。而ed2k服務(wù)器作為一個通訊中心,幫助用戶在ed2k網(wǎng)絡(luò)內(nèi)查找文件。它的客戶端和服務(wù)端可以工作于Windows、Macintosh、Linux、UNIX等操作系統(tǒng)。任何人都可以作為服務(wù)器加入這個網(wǎng)絡(luò)。

項目如圖:


? ?共有8個項目!~~~~~

emule為電驢主要工程。

Zlib為數(shù)據(jù)壓縮支持庫,傳輸過程中支持數(shù)據(jù)壓縮。

Id3lib為用于讀、寫和操縱ID3v1和ID3v2標簽的對于媒體類型的文件,它能夠調(diào)用id3lib庫來獲取諸如作者,唱片年代,風(fēng)格等tag信息,如果是視頻媒體文件,它還會抓圖。

Png為提供對PNG文件處理的支持。

Resizable為一個界面庫,可以根據(jù)父窗口的位置和大小動態(tài)調(diào)整控件窗口的大小。

Crypto51為密碼類庫,實現(xiàn)了各種公開密鑰算法、對稱加密算法、數(shù)字簽名算法、信息摘要算法,而電驢用于實現(xiàn)RSA簽名,支持獨有的積分機制。

CxImage為圖像處理庫,與Windows、MFC支持極好,支持圖像的多重操作(線性濾波、中值濾波、直方圖操作、旋轉(zhuǎn)縮放、區(qū)域選取、閾值處理、alpha混合等等)。

miniupnpc為操作局域網(wǎng)中所有的UPNP設(shè)備。


效果如圖:









主程序共有五百多個目標文件,分析結(jié)合了網(wǎng)上的資源,主要分析如下:

當emule中開始使用Kademlia網(wǎng)絡(luò)后,便不再會有中心服務(wù)器失效這樣的問題了,因為在這個網(wǎng)絡(luò)中,沒有中心服務(wù)器,或者說,所有的用戶都是服務(wù)器,所有的用戶都是客戶端。

class CBufferedFileIO : public CStdioFile, public CDataIO//多文件操作緩沖 class CByteIO : public CDataIO//擴展了字節(jié)操作數(shù)據(jù) class CContact//自定義的聯(lián)系人信息類//主要包含對方的ip地址、ID、tcp端口、udp端口,Kad版本號以及其健康程度(健康程度有四個層次) class CDataIO//數(shù)據(jù)通信類 數(shù)據(jù)類型有byte、int8/16/32/64/128、hash、float、Bsob、String、Tag等 class CEntry//輸入 例如:文件名設(shè)置 class CFileIO : public CFile, public CDataIO//擴展了文件數(shù)據(jù)操作 class CIndexed//處理本地存儲的索引信//利用了一些列的Map來存儲這些對應(yīng)消息,CMap是MFC中實現(xiàn)標準STL中的map的模版累,該類中包含了四個這樣的類,分別用來//存儲文件源信息、關(guān)鍵詞信息、文件評論信息以及負載信息//其中文件評論信息是不長久保存的,而其它的信息都會在退出時候?qū)懙轿募?/下載重啟時再重新調(diào)入,另外負載信息不是等其它聯(lián)系人來發(fā)布的,而是根據(jù)文件源信息和關(guān)鍵詞信息的發(fā)布情況自行進行動態(tài)調(diào)整的//該類為其它部分的代碼提供了它們所需要的增加信息和搜索信息的接口,這樣在從網(wǎng)絡(luò)中獲取到的相關(guān)的搜索或者發(fā)布請求,并且//CKademliaUDPListener完成消息的解釋后,就可以交給該類來進行處理。//一個文件源信息是一個文件內(nèi)容的hash值和擁有這個文件的客戶端的ip地址,各種端口號以及其它信息之間的對應(yīng)關(guān)系,//而一個關(guān)鍵詞信息則是該關(guān)鍵詞和它對應(yīng)的文件之間的關(guān)系 class CIOException : public CException//輸入輸出異常處理 class CKadClientSearcher//Kad客戶端網(wǎng)絡(luò)搜索 通過ip地址或id節(jié)點搜索 class CKademlia//Kademlia網(wǎng)絡(luò)的主控類,負責(zé)啟動和關(guān)閉整個Kademlia網(wǎng)的相關(guān)代碼,在它的Process函數(shù)中,會處理和Kademlia網(wǎng)相關(guān)的事務(wù),例如://隔一段時間檢查某個區(qū)間的節(jié)點數(shù)是否過少,如果是則尋找一些新的節(jié)點,另外經(jīng)常對自己的鄰居進行檢查等,這些都是屬于需要進行日常安排的//工作,所有搜索任務(wù)的日常處理也需要它來調(diào)度,它還作為Kademlia網(wǎng)的代表,向emule其它部分的代碼返回kademlia網(wǎng)的一些統(tǒng)計信息 class CKademliaError//自定義了Kademlia網(wǎng)絡(luò)的錯誤信息 class CKademliaUDPListener : public CPacketTracking//專門處理和Kademlia協(xié)議相關(guān)的UDP包//負責(zé)處理UDP網(wǎng)絡(luò)信息,處理所有和Kademlia網(wǎng)相關(guān)的消息,工作已經(jīng)在emule的普通UDP客戶端處理代碼那里處理好了//具體的消息分類:首先是健康檢查方面的消息,一般是ping-pong機制,//對應(yīng)的消息有KADEMLIA_HELLO_REQ和KADEMLIA_HELLO_RES,對本地聯(lián)系人信息列表進行檢查時,會對它們發(fā)送KADEMLIA_HELLO_REQ消息//最常用的消息是節(jié)點搜索消息,在Kademlia網(wǎng)絡(luò)中,進行節(jié)點搜索是日常應(yīng)用所需要傳輸?shù)闹饕?#xff0c;它的實現(xiàn)方式是迭代式的搜索。Kad網(wǎng)自定義了標識數(shù)據(jù) 有如下:bool Bsob Float Hash String Uint UInt16/32/64等等

class CKeyEntry : public CEntry//關(guān)鍵詞輸入 可以搜索/匹配信息 class CLookupHistory//自定義了查詢歷史記錄 class CMiscUtils//單元轉(zhuǎn)換 例如:ip地址轉(zhuǎn)換成字符串 class CPacketTracking//封包跟蹤 class CPrefs//處理自身的Kademlia相關(guān)信息,它和emule普通代碼中的CPreferences作用類似,但是CPrefs只保留和Kademlia網(wǎng)相關(guān)的,需要長期保存的本地信息,//主要就是本地的id class CRoutingBin//包含一個CContact的列表,要訪問聯(lián)系人的信息必須通過某個CRoutingBin,CRoutingZone內(nèi)部是不直接包含聯(lián)系人信息的//可以把新的聯(lián)系人信息往一個特定的CRoutingBin中加,當然也可以進行聯(lián)系人查找,它也提供方法能夠?qū)ふ页鲭x某個ID距離最近的聯(lián)系人,并給出//這樣的一個列表(一個CRoutingBin類中能夠包含的CContact的數(shù)量的) class CRoutingZone//處理聯(lián)系人數(shù)據(jù)結(jié)構(gòu)的最上層,直接為Kademlia網(wǎng)提供操作接口,該類的結(jié)構(gòu)為一個二叉樹,內(nèi)含兩個CRoutingZone指向它的左子樹和右子樹//另外也包含一個CRoutingBin類型的指針,但是只有在當前的CRoutingZone類為整個二叉樹的葉節(jié)點時,這個指向CRoutingBin類型的指針才有意義。 class CSearch//一個具體的搜索任務(wù),它包括了一個搜索任務(wù)從發(fā)起到結(jié)束的全部過程,要注意的是//搜索任務(wù)并不只是指搜索文件源或者關(guān)鍵詞的任務(wù)//一次發(fā)布任務(wù)它也需要創(chuàng)建一個該類對象,并且讓它開始執(zhí)行//在創(chuàng)建的時候需要說明它的類型,例如是為了搜索節(jié)點還是搜索關(guān)鍵詞信息或者文件源信息//啟動,開始第一次從本地的聯(lián)系人列表中尋找候選的聯(lián)系人,然后開始發(fā)動搜索//void CSearch::Go()//向某個聯(lián)系人發(fā)送一個搜索某id的聯(lián)系人信息請求//void SendFindValue(CContact* pContact, bool bReAskMore = false);//在搜索進行到一定地步的時候,如果得到了一些 中間結(jié)果,開始進行下一步的行動,下一步的行動仍然可能是SendFindValue//也可能認為搜索到的聯(lián)系人離目標已經(jīng)足夠近了,于是就可以開始實質(zhì)性的請求//void JumpStart();//一個實質(zhì)性的請求//void StorePacket(); class CSearchManager//掌握所有的搜索任務(wù),它包含了一個所有CSearch指針對象的CMap//使用CMap的原因是因為所有的CSearch都一定對應(yīng)一個ID,這個ID就是該CSearch所對應(yīng)的目標,不管是要查找節(jié)點//還是要搜索或者發(fā)布信息,一定都要找到和目標id相近的聯(lián)系人//直接和Kademlia網(wǎng)的其它部分代碼接觸,例如:CKademliaUDPListener搜索到了一些結(jié)果,它會把這些結(jié)果交給該類//然后該類再去尋找這個結(jié)果是屬于那個搜索任務(wù)的,并且進行轉(zhuǎn)交//另外,該類對外提供創(chuàng)建各種新的搜索任務(wù)的接口,作用類擬于設(shè)計模式中的factory,其它部分的代碼只需要說明//需要開始一個什么樣的搜索任務(wù)即可 class CUDPFirewallTester//Kad網(wǎng)針對UDP防火墻測試 class CUInt128//實現(xiàn)對128位的ID的各種處理,并且內(nèi)置其各種運算//處理一個128位的長整數(shù) class C3DPreviewControl : public CStatic //重載CStatic 實現(xiàn)3D效果 class CAbstractFile: public CObject // 派生出三個類CCollectionFile,CKnownFile和CSearchFile,CAbstractFile類的基類是CObject // typedef CTypedPtrList<CPtrList, Kademlia::CEntry*> CKadEntryPtrList; //這是一個模板類,使用CTypedPtrList類,必須添加afxtempl.h這個頭文件, //template < class BASE_CLASS, class TYPE > class //CTypedPtrList : public BASE_CLASS // BASE_CLASS 類型指針列表類的基類;必須是一個指針列表類CObList或CPtrList。 // TYPE 保存在基類列表中的元素的類型。 // 聲明了從CPtrList派生的類型指針列表CKadEntryPtrList該列表存儲并返回指向Kademlia::CEntry對象的指針。 // SetFileName函數(shù) // void CAbstractFile::SetFileName(LPCTSTR pszFileName, bool bReplaceInvalidFileSystemChars, bool bAutoSetFileType) //{ // m_strFileName = pszFileName; // if (bReplaceInvalidFileSystemChars){//替換無效的字符,也就在替換文件名不能包含的字符 // m_strFileName.Replace(_T('/'), _T('-')); // m_strFileName.Replace(_T('>'), _T('-')); // m_strFileName.Replace(_T('<'), _T('-')); // m_strFileName.Replace(_T('*'), _T('-')); // m_strFileName.Replace(_T(':'), _T('-')); // m_strFileName.Replace(_T('?'), _T('-')); // m_strFileName.Replace(_T('/"'), _T('-')); // m_strFileName.Replace(_T('//'), _T('-')); // m_strFileName.Replace(_T('|'), _T('-')); // } // if (bAutoSetFileType) // SetFileType(GetFileTypeByName(m_strFileName));//文件類型,視頻,圖片等 //} //SetFileHas函數(shù) //void CAbstractFile::SetFileHash(const uchar* pucFileHash) //{ // md4cpy(m_abyFileHash, pucFileHash); //} //Md4cpy是一個內(nèi)聯(lián)函數(shù),用于拷貝md4算法生成的散列值 //__inline void md4cpy(void* dst, const void* src) { // ((uint32*)dst)[0] = ((uint32*)src)[0]; // ((uint32*)dst)[1] = ((uint32*)src)[1]; // ((uint32*)dst)[2] = ((uint32*)src)[2]; // ((uint32*)dst)[3] = ((uint32*)src)[3]; //} //__inline是Microsoft SpecificMd4算法生成的是128為散列值,所以一個uint32表示32位所以就有上面的四行代碼. //virtual void SetFileSize(EMFileSize nFileSize) { m_nFileSize = nFileSize; } //oid CKnownFile::SetFileSize(EMFileSize nFileSize) //{ // CAbstractFile::SetFileSize(nFileSize); // m_pAICHHashSet->SetFileSize(nFileSize); // if (nFileSize == (uint64)0){//文件大小為的處理 // ASSERT(0); // m_iPartCount = 0; // m_iED2KPartCount = 0; // m_iED2KPartHashCount = 0; // return; // } // // nr. of data parts // ASSERT( (uint64)(((uint64)nFileSize + (PARTSIZE - 1)) / PARTSIZE) <= (UINT)USHRT_MAX ); // //PARTSIZE 9728000 // //USHRT_MAX 65535 // m_iPartCount = (uint16)(((uint64)nFileSize + (PARTSIZE - 1)) / PARTSIZE); // // nr. of parts to be used with OP_FILESTATUS // m_iED2KPartCount = (uint16)((uint64)nFileSize / PARTSIZE + 1); // // nr. of parts to be used with OP_HASHSETANSWER // m_iED2KPartHashCount = (uint16)((uint64)nFileSize / PARTSIZE); // if (m_iED2KPartHashCount != 0) // m_iED2KPartHashCount += 1; //} //代碼分析 //Ed2K鏈接 如下 //ed2k://|file|100M.rar|142773857|54703D1BA90B7E8FB588C8137AD67A42|p=8DF50FD599BC060A943D464D10FD978B:EB2922FEFDA86F5DAE9EA8092EEF8D90:1B89E953F71BA8C9FCB079210BC62367|/ //這里面包含Data parts ,ED2K parts ,ED2K part hashs,與SetFileSiz函數(shù)中的的對應(yīng)關(guān)系如下 //Data parts是m_iPartCount //ED2K parts 是m_iED2KPartCount //ED2K part hashs是m_iED2KPartHashCount //Data parts的計算方法 //文件大小小于等于9.28M,Data parts就是1 //文件大小大于,以9.28M為單位,分割文件,用文件大小除以9.28M,得到一個數(shù)n,,如果有余數(shù),那么Data parts就是n+1,沒有余數(shù)Data parts就是n. //代碼如下,計算Data parts的代碼設(shè)計的很巧妙.,. //m_iPartCount = (uint16)(((uint64)nFileSize + (PARTSIZE - 1)) / PARTSIZE); //ED2K parts的計算方法 //用文件大小去除以9.28M得到整數(shù)值然后加1 //代碼如下 //m_iED2KPartCount = (uint16)((uint64)nFileSize / PARTSIZE + 1); //ED2K part hashs的計算方法 //P=后面的字符串就 ED2K part hashs 也就是片段哈希值.例子中一共有三塊.,每一塊的Hash值之間用:號隔開 //如果文件大小小于9.28M,將不會出現(xiàn)"P="的字符串,ED2K part hashs為空 //如果文件大小大于等于9.28M,ED2K part 塊數(shù)的計算方法是文件大小去除以9.28M得到整數(shù)值然后+1 //代碼就是 //m_iED2KPartHashCount = (uint16)((uint64)nFileSize / PARTSIZE); //if (m_iED2KPartHashCount != 0) //m_iED2KPartHashCount += 1; class CAddFileThread : public CWinThread //添加文件線程 //針對下載的Part文件就沒必要重頭完整計算hashlist 和 整顆 AICH Hash Tree了,這樣就加快了下載完成時候的hash計算。 class CAddFriend : public CDialog //添加好友對話框 class CAddSourceDlg : public CResizableDialog //添加資源對話框 使用了第三方庫ResizableLibemule中的分塊處理和恢復(fù)機制,分塊處理以及hash計算相關(guān)的類有:

CAICHHash、CAICHHashAlgo、CAICHHashTree、CAICHRecoveryHashSet、CAICHRequestedData、CAICHSyncThread、CAICHUntrustedHash等

class CArchivePreviewDlg : public CResizablePage //存檔預(yù)覽對話框 class CArchiveRecovery //提供一個自動處理Zip和rar的類 class CAsyncProxySocketLayer : public CAsyncSocketExLayer //主要是提供了對SOCKSv4,SOCKSv5和HTTP1.1 代理的支持。 class CAsyncSocketEx : public CObject //兼容CAsyncSocketEx類,把應(yīng)用程序中所有的CAsyncSocket換成CAsyncSocketEx //程序仍然能夠和原來的功能相同,因此在使用上更加方便 //在消息分發(fā)機制上,它處理和Socket相關(guān)的消息的效率要比原始的MFC的CAsyncSocket類更高 //它支持通過實現(xiàn)CAsyncSocketExLayer類的方式,將一個Socket分成若干個層,從而可以很方便 //得實現(xiàn)許多網(wǎng)絡(luò)功能,如:設(shè)置代理、使用SSL進行加密 class CAsyncSocketExHelperWindow //當socket事件accept, read, write等發(fā)生時,發(fā)送消息到CAsyncSocketExHelperWindow中的窗口hWnd, //然后CAsyncSocketExHelperWindow再通過回調(diào)函數(shù)WindowProc將消息發(fā)回到負責(zé)處理這個消息的CAsyncSocketEx上。 class CAsyncSocketExLayer //異步通信程序庫 //通過實現(xiàn)CAsyncSocketExLayer類的方式,將一個SOCKET分成若干個層, //從而可以很方便得實現(xiàn)許多網(wǎng)絡(luò)功能,如設(shè)置代理,或者是使用SSL進行加密等。 class CBarShader //自定義條橫著色器 class CBase64Coding //基于64的編碼 class CBitmapDataObject : public CCmdTarget //圖片數(shù)據(jù)對象 class CButtonST : public CButton //自繪按鈕控件 class CButtonsTabCtrl : public CTabCtrl //自繪多標簽控件 class CCaptchaGenerator //產(chǎn)生驗證碼 class CCBBRecord //BB信息記錄 例如ip地址 開始位置 結(jié)束位置 class CChatItem //任務(wù)節(jié)點 class CChatSelector : public CClosableTabCtrl, CFriendConnectionListener //任務(wù)的管理 class CChatWnd : public CResizableDialog //任務(wù)的設(shè)置對話框 class CCKey : public CObject //如果哈希值存儲某處其他(并保持有效的,只要這個對象存在) class CClientCredits //信譽機制的信息需要有一定的可靠性,在emule中采用了數(shù)字簽名的方法來做到這一點 //Crypto++庫為emule全程提供和數(shù)字簽名驗證相關(guān)的功能//struct CreditStruct{ // uchar abyKey[16]; // uint32 nUploadedLo; // uploaded TO him // uint32 nDownloadedLo; // downloaded from him // uint32 nLastSeen; // uint32 nUploadedHi; // upload high 32 // uint32 nDownloadedHi; // download high 32 // uint16 nReserved3; // uint8 nKeySize; // uchar abySecureIdent[MAXPUBKEYSIZE]; //}; //使用該結(jié)構(gòu)來記錄信息,如:上傳量和下載量等 class CClientCreditsList //提供了loadlist和savelist方法永久保存信譽相關(guān)的信息 //在創(chuàng)建時,會裝載自己的公鑰私鑰,如果沒有的話,會創(chuàng)建一對 //該類中包含的有效的信息都是經(jīng)過其他人數(shù)字簽名的,所以更加有信服力 class CClientDetailDialog : public CListViewWalkerPropertySheet //客戶詳細信息顯示對話框 class CClientReqSocket : public CEMSocket //能夠自動完成emule的packet識別工作,它有ProcessPacket和ProcessExtPacket來處理客戶端和客戶端之間的包 //其中前者是經(jīng)典的eDonkey協(xié)議的包,后者是emule擴展協(xié)議的包 //表示了一個客戶端的信息,側(cè)重在網(wǎng)絡(luò)數(shù)據(jù)方面,即負責(zé)兩邊的互相通信 class CClientUDPSocket : public CAsyncSocket, public CEncryptedDatagramSocket, public ThrottledControlSocket // ZZ:UploadBandWithThrottler (UDP) //一個客戶端UDP套接字處理 class CClientVersionInfo //版本信息 class CCollection //消息集合操作 例如:從文件中讀取消息、把消息放到文件中、移除消息等等 class CCriticalSectionWrapper //觸發(fā)機制 class CDeadSource : public CObject //地址源出錯 class CDeadSourceList //管理出錯資源 class CDownloadQueue //下載隊列類,這個隊列中的項目是CPartFile指針,它還需要能夠提供對這個列表中的元素進行增加、查詢、刪除的功能(文件的hashID或索引) //還要完成一些統(tǒng)計的工作,統(tǒng)計的信息都是放在對應(yīng)的.part文件中 //因此該類進行初始化的時候,它需要尋找所有可能的下載路徑,從那些路徑中找到所有的.part文件,并且試圖 //用這些文件來生成CPartFile類,并且將這些通過.part文件正確生成CPartFile類添加到自己的列表中 //在退出時,所有的下載任務(wù)的元信息也是自行保存,不會合成一個文件。//把它的列表中的CPartFile類中的Process方法都調(diào)用一遍 //下載情況的統(tǒng)計信息也是在每一輪的Process后進行更新的 //從這里看該方法在emule中是很有意義的,就是必須通過它來完成日常工作 //而且所有的這些process方法肯定是順序執(zhí)行,因此可以減少很多線程同步之類的問題 //void CDownloadQueue::Process(){ // // ProcessLocalRequests(); // send src requests to local server // // uint32 downspeed = 0; // uint64 maxDownload = thePrefs.GetMaxDownloadInBytesPerSec(true); // if (maxDownload != UNLIMITED*1024 && datarate > 1500){ // downspeed = (UINT)((maxDownload*100)/(datarate+1)); // if (downspeed < 50) // downspeed = 50; // else if (downspeed > 200) // downspeed = 200; // } // // while(avarage_dr_list.GetCount()>0 && (GetTickCount() - avarage_dr_list.GetHead().timestamp > 10*1000) ) // m_datarateMS-=avarage_dr_list.RemoveHead().datalen; // // if (avarage_dr_list.GetCount()>1){ // datarate = (UINT)(m_datarateMS / avarage_dr_list.GetCount()); // } else { // datarate = 0; // } // // uint32 datarateX=0; // udcounter++; // // theStats.m_fGlobalDone = 0; // theStats.m_fGlobalSize = 0; // theStats.m_dwOverallStatus=0; // //filelist is already sorted by prio, therefore I removed all the extra loops.. // for (POSITION pos = filelist.GetHeadPosition();pos != 0;){ // CPartFile* cur_file = filelist.GetNext(pos); // // // maintain global download stats // theStats.m_fGlobalDone += (uint64)cur_file->GetCompletedSize(); // theStats.m_fGlobalSize += (uint64)cur_file->GetFileSize(); // // if (cur_file->GetTransferringSrcCount()>0) // theStats.m_dwOverallStatus |= STATE_DOWNLOADING; // if (cur_file->GetStatus()==PS_ERROR) // theStats.m_dwOverallStatus |= STATE_ERROROUS; // // // if (cur_file->GetStatus() == PS_READY || cur_file->GetStatus() == PS_EMPTY){ // datarateX += cur_file->Process(downspeed, udcounter); // } // else{ // //This will make sure we don't keep old sources to paused and stoped files.. // cur_file->StopPausedFile(); // } // } // // TransferredData newitem = {datarateX, ::GetTickCount()}; // avarage_dr_list.AddTail(newitem); // m_datarateMS+=datarateX; // // if (udcounter == 5){ // if (theApp.serverconnect->IsUDPSocketAvailable()){ // if((!lastudpstattime) || (::GetTickCount() - lastudpstattime) > UDPSERVERSTATTIME){ // lastudpstattime = ::GetTickCount(); // theApp.serverlist->ServerStats(); // } // } // } // // if (udcounter == 10){ // udcounter = 0; // if (theApp.serverconnect->IsUDPSocketAvailable()){ // if ((!lastudpsearchtime) || (::GetTickCount() - lastudpsearchtime) > UDPSERVERREASKTIME) // SendNextUDPPacket(); // } // } // // CheckDiskspaceTimed(); // // // ZZ:DownloadManager --> // if((!m_dwLastA4AFtime) || (::GetTickCount() - m_dwLastA4AFtime) > MIN2MS(8)) { // theApp.clientlist->ProcessA4AFClients(); // m_dwLastA4AFtime = ::GetTickCount(); // } // // <-- ZZ:DownloadManager //} class CED2KFileLink : public CED2KLink //ED2K文件鏈接操作 class CED2KFileTypes //ED2K文件類型 class CED2KLink //ED2K連接操作 class CED2kLinkDlg : public CResizablePage ED2K鏈接操作對話框 class CED2KNodesListLink : public CED2KLink ED2K節(jié)點列表鏈接操作 class CED2KSearchLink : public CED2KLinkED2K搜索鏈接 class CED2KServerLink : public CED2KLink //ED2K服務(wù)器鏈接 class CED2KServerLink : public CED2KLink //ED2K服務(wù)器鏈接 class CEMFileSize //操作EM文件 class CEMSocket : public CEncryptedStreamSocket, public ThrottledFileSocket // ZZ:UploadBandWithThrottler (UDP) //分離出狀態(tài),如當前是否在發(fā)送控制信息等,它的SendControlData方法和UploadBandwidthThrottler進行配合進行全局的限速功能 //如果要打到上傳數(shù)據(jù)限速的目的,不應(yīng)該直接調(diào)用標準的Send或SendTo方法,而是調(diào)用SendPacket //Packet是一個結(jié)構(gòu)體,包含了一個emule協(xié)議中完整的包,還內(nèi)置了PackPacket和UnPackPacket方法,可以自行進行壓縮和解壓的功能//開發(fā)發(fā)起連接,先檢查是否設(shè)置了代理 // BOOL CEMSocket::Connect(SOCKADDR* pSockAddr, int iSockAddrLen) //{ // InitProxySupport(); // return CEncryptedStreamSocket::Connect(pSockAddr, iSockAddrLen); //}//成員函數(shù) //virtual SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) //{ return Send(maxNumberOfBytesToSend, minFragSize, true); }; //virtual SocketSentBytes SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) //{ return Send(maxNumberOfBytesToSend, minFragSize, false); }; //兩個方法都調(diào)用了Send方法,該兩個方法是在UploadBandwidthThrottler的工作線程中的大環(huán)境中被調(diào)用的 class CemuleApp : public CWinApp//通過在注冊表里添加一些項目可以讓一個程序和某種鏈接或者某個后綴的文件產(chǎn)生關(guān)聯(lián) // bool CemuleApp::ProcessCommandline() //{ // bool bIgnoreRunningInstances = (GetProfileInt(_T("eMule"), _T("IgnoreInstances"), 0) != 0); // for (int i = 1; i < __argc; i++){ // LPCTSTR pszParam = __targv[i]; // if (pszParam[0] == _T('-') || pszParam[0] == _T('/')){ // pszParam++; //#ifdef _DEBUG // if (_tcsicmp(pszParam, _T("assertfile")) == 0) // _CrtSetReportHook(CrtDebugReportCB); //#endif // if (_tcsicmp(pszParam, _T("ignoreinstances")) == 0) // bIgnoreRunningInstances = true; // // if (_tcsicmp(pszParam, _T("AutoStart")) == 0) // m_bAutoStart = true; // } // } // // CCommandLineInfo cmdInfo; // ParseCommandLine(cmdInfo); // // // 如果我們創(chuàng)建了我們的TCP偵聽套接字SO_REUSEADDR,我們必須確保有2 eMule總是使用相同的端口。 // // NOTE: 這不會阻止從其他一些使用該端口的應(yīng)用程序! // UINT uTcpPort = GetProfileInt(_T("eMule"), _T("Port"), DEFAULT_TCP_PORT_OLD); // CString strMutextName; // strMutextName.Format(_T("%s:%u"), EMULE_GUID, uTcpPort); // m_hMutexOneInstance = ::CreateMutex(NULL, FALSE, strMutextName); // // HWND maininst = NULL; // bool bAlreadyRunning = false; // // //啟動另外一個實例 // if(bIgnoreRunningInstances) // { // if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen // && (cmdInfo.m_strFileName.Find(_T("://")) > 0 // || CCollection::HasCollectionExtention(cmdInfo.m_strFileName)) ) // bIgnoreRunningInstances = false; // } // if (!bIgnoreRunningInstances){ // bAlreadyRunning = (::GetLastError() == ERROR_ALREADY_EXISTS ||::GetLastError() == ERROR_ACCESS_DENIED); // if (bAlreadyRunning) EnumWindows(SearchEmuleWindow, (LPARAM)&maininst); // } // // if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) { // CString* command = new CString(cmdInfo.m_strFileName); // if (command->Find(_T("://"))>0) { // sendstruct.cbData = (command->GetLength() + 1)*sizeof(TCHAR); // sendstruct.dwData = OP_ED2KLINK; // sendstruct.lpData = const_cast<LPTSTR>((LPCTSTR)*command); // if (maininst){ // SendMessage(maininst, WM_COPYDATA, (WPARAM)0, (LPARAM)(PCOPYDATASTRUCT)&sendstruct); // delete command; // return true; // } // else // pstrPendingLink = command; // } // else if (CCollection::HasCollectionExtention(*command)) { // sendstruct.cbData = (command->GetLength() + 1)*sizeof(TCHAR); // sendstruct.dwData = OP_COLLECTION; // sendstruct.lpData = const_cast<LPTSTR>((LPCTSTR)*command); // if (maininst){ // SendMessage(maininst, WM_COPYDATA, (WPARAM)0, (LPARAM)(PCOPYDATASTRUCT)&sendstruct); // delete command; // return true; // } // else // pstrPendingLink = command; // } // else { // sendstruct.cbData = (command->GetLength() + 1)*sizeof(TCHAR); // sendstruct.dwData = OP_CLCOMMAND; // sendstruct.lpData = const_cast<LPTSTR>((LPCTSTR)*command); // if (maininst){ // SendMessage(maininst, WM_COPYDATA, (WPARAM)0, (LPARAM)(PCOPYDATASTRUCT)&sendstruct); // delete command; // return true; // } // // 不要啟動,如果我們調(diào)用的“退出”命令。 // if (command->CompareNoCase(_T("exit")) == 0) { // delete command; // return true; // } // delete command; // } // } // return (maininst || bAlreadyRunning); //}//theApp.serverlist->Init(); //從文件中讀取ServerMet_Struct( 標簽)和從文本文件讀取靜態(tài)server列表;//下載隊列初始化 //theApp.downloadqueue->Init();//啟動客戶端監(jiān)聽 //theApp.listensocket->StartListening() // //對象創(chuàng)建套接字 //CClientUDPSocket theApp.clientudp->Create() // //檢測啟動是否自動連接服務(wù)器 //if (thePrefs.DoAutoConnect()) //連接emule服務(wù)器 //theApp.emuledlg->OnBnClickedButton2(); //調(diào)用connectserver對象的trytoconnectanyserver()連接全局服務(wù)器。 //主程序?qū)υ捒? class CemuleDlg : public CTrayDialog//關(guān)鍵啟動(主連接) // void CemuleDlg::StartConnection() //{ // if ( (!theApp.serverconnect->IsConnecting() && !theApp.serverconnect->IsConnected()) // || !Kademlia::CKademlia::IsRunning()) // { // //UPnP是仍然在試圖打開的端口。 // //為了不連接的服務(wù)器/ Kad網(wǎng)絡(luò)前的端口都開了,我們拖延的連接, // //直到UPnP得到一個低-ID或達到超時 // if (m_hUPnPTimeOutTimer != 0 && !m_bConnectRequestDelayedForUPnP){ // AddLogLine(false, GetResString(IDS_DELAYEDBYUPNP)); // AddLogLine(true, GetResString(IDS_DELAYEDBYUPNP2)); // m_bConnectRequestDelayedForUPnP = true; // return; // } // else{ // m_bConnectRequestDelayedForUPnP = false; // if (m_hUPnPTimeOutTimer != 0){ // VERIFY( ::KillTimer(NULL, m_hUPnPTimeOutTimer) ); // m_hUPnPTimeOutTimer = 0; // } // AddLogLine(true, GetResString(IDS_CONNECTING)); // // // ed2k // if ((thePrefs.GetNetworkED2K() || m_bEd2kSuspendDisconnect) && !theApp.serverconnect->IsConnecting() && !theApp.serverconnect->IsConnected()) { // theApp.serverconnect->ConnectToAnyServer(); // } // // // kad // if ((thePrefs.GetNetworkKademlia() || m_bKadSuspendDisconnect) && !Kademlia::CKademlia::IsRunning()) { // Kademlia::CKademlia::Start(); // } // } // // ShowConnectionState(); // } // m_bEd2kSuspendDisconnect = false; // m_bKadSuspendDisconnect = false; //} // 斷開連接(主連接) //void CemuleDlg::CloseConnection() //{ // if (theApp.serverconnect->IsConnected()){ // theApp.serverconnect->Disconnect(); // } // // if (theApp.serverconnect->IsConnecting()){ // theApp.serverconnect->StopConnectionTry(); // } // Kademlia::CKademlia::Stop(); // theApp.OnlineSig(); // Added By Bouc7 // ShowConnectionState(); //}//設(shè)置啟動定時器 //CEmuleDlg::OnInitDlg ::SetTimer(NULL, NULL, 300, StartupTimer) ; //定時器函數(shù) 完成各對象初始化初始化服務(wù)器列表 //static void CALLBACK StartupTimer(HWND hwnd, UINT uiMsg, UINT idEvent, DWORD dwTime); class CEnBitmap : public CBitmap //圖片操作 class CEncryptedDatagramSocket //數(shù)據(jù)包編碼 class CEncryptedStreamSocket : public CAsyncSocketEx //數(shù)據(jù)流編碼 //操作文件 class CFileDataIO //數(shù)據(jù)操作的行為或數(shù)據(jù)操作的對象分割開來 //各種整形、字符串以及Tag類型,整形讀寫起來比較簡單 class CFileDetailDialog : public CListViewWalkerPropertySheet //文件詳細顯示對話框 class CFirewallOpener //防火墻操作 例如:打開某端口、刪除策略等 class CFriend : public Kademlia::CKadClientSearcher //Kad網(wǎng)鄰居類 class CFriendConnectionListener//針對Kad網(wǎng)鄰居的連接監(jiān)聽 class CFriendList //Kad網(wǎng)鄰居列表 class CFriendListCtrl : public CMuleListCtrl //Kad網(wǎng)鄰居列表管理 class CGDIThread : public CWinThread //界面繪圖操作線程 class CGetMediaInfoThread : public CWinThread //得到媒體文件信息的線程 class CGetMediaInfoThread : public CWinThread //得到媒體文件信息的線程 class CHttpClientDownSocket : public CHttpClientReqSocket //http下載套接字 class CHttpClientReqSocket : public CClientReqSocket //擴展了CClientReqSocket class CHttpDownloadDlg : public CDialog //下載任務(wù)顯示對話框 class CHyperLink //超鏈接 class CHyperTextCtrl : public CWnd //超鏈接文本

class CIPFilter //IP地址過濾器,通過識別各種類型的ip地址過濾信息 //它能夠把不希望連接的網(wǎng)絡(luò)地址過濾掉 //emule中所有需要連接網(wǎng)絡(luò)的地方使用的都是統(tǒng)一的過濾數(shù)據(jù) class CIPFilterDlg : public CResizableDialog //ip過濾顯示對話框 //專注某個特定文件的信息的類(增加信息存取) class CKnownFile : public CShareableFile //把讀到的文件信息都保存成一個一個的tag //它在運行中會盡量獲得更多的文件信息 class CKnownFileList //使用了MFC的CMap類來維護內(nèi)部的hash表,它內(nèi)部維護了一個已知的文件的列表和取消了文件列表,//hash表的關(guān)鍵字都是文件hash的值,能夠判斷出文件名不同而內(nèi)容相同的文件 class CPartFile : public CKnownFile //是emule中用來表示一個下載任務(wù)的類(一個還沒有下載完成的文件) //當下載任務(wù)時emule會在下載目錄中創(chuàng)建兩個文件,以三位數(shù)字家后綴part的文件,表示的是對應(yīng)文件的元信息 //part文件會創(chuàng)建得和原始文件大小一樣,當下載完成后,文件名會修改成它本來的名稱 //事實上,諸如:文件名字、修改日期、大小、下載完成的信息等信息元素都在對應(yīng)的.part元文件中//struct Gap_Struct //{ // uint64 start; // uint64 end; //}; //該結(jié)構(gòu)表示一個吭,說明該文件從多少字節(jié)的偏移到多少字節(jié)偏移是一個吭 //變量成員gaplist說明該文件目前的吭的狀況列表 //需要注意的是有時填了吭的中間部分后,會把一個坑編程兩個吭,吭的列表也會被存進.part.met中//該類的創(chuàng)建有幾種可能,從搜索文件中創(chuàng)建(點擊下載)、從一個包含了ed2k鏈接的字符串中創(chuàng)建、emule重啟恢復(fù)以前的下載任務(wù)創(chuàng)建。 //這時就是去下載目錄中尋找那些.part文件了,另外它還需要不斷得處理下載到的數(shù)據(jù),為了減少磁盤開銷, //使用了Requested_Block_Struct結(jié)構(gòu)來暫存寫入的數(shù)據(jù) //它內(nèi)部維護一個CupDownClient的列表,如果知道該文件的一個新的來源信息,就會創(chuàng)建一個對應(yīng)的CUpDownClient //它還要把它的狀態(tài)用彩色的條狀物顯示出來(GUI)。 class CPartFileConvert //能偶對其它版本的emule下載的文件進行轉(zhuǎn)換

class CPeerCacheFinder //為前面的PeerCache技術(shù)的主控類 由Joltid公司開發(fā)的技術(shù),它可以允許你從ISP提供的一些快照服務(wù)器上快速得上傳或下載一些文件 這技術(shù)的好處是可以減少骨干網(wǎng)絡(luò)的帶寬消耗,將部分本來需要在骨干網(wǎng)上走的流量轉(zhuǎn)移到ISP的內(nèi)部 class CPreferences//掌握著程序的大部分配置數(shù)據(jù),它們的特點都是有很多的成員變量,而且還是靜態(tài)的,這種方式可以保證他們的唯一性,并且把這些//變量統(tǒng)一到一個類管理。但是實際上并不需要了解每個變量的含義//thePrefs和theStats是它的唯一的實例!~~ class CRARFile //操作rar文件 class CScheduler //能夠?qū)崿F(xiàn)下載任務(wù)的定時下載 class CSearchFile : public CAbstractFile //保存了某個文件和搜索相關(guān)的信息,不是這個文件本身的信息,就是都在哪些機器上有這個文件 //以及哪個服務(wù)器上搜索到這個文件,甚至可以向搜索文件添加預(yù)覽//闕套結(jié)構(gòu)體 //struct SServer { // SServer() { // m_nIP = 0; // m_nPort = 0; // m_uAvail = 0; // m_bUDPAnswer = false; // } // SServer(uint32 nIP, uint16 nPort, bool bUDPAnswer) { // m_nIP = nIP; // m_nPort = nPort; // m_uAvail = 0; // m_bUDPAnswer = bUDPAnswer; // } // friend __inline bool __stdcall operator==(const CSearchFile::SServer& s1, const CSearchFile::SServer& s2) { // return s1.m_nIP==s2.m_nIP && s1.m_nPort==s2.m_nPort; // } // uint32 m_nIP; // uint16 m_nPort; // UINT m_uAvail; // bool m_bUDPAnswer; //}; //struct SClient { // SClient() { // m_nIP = 0; // m_nPort = 0; // m_nServerIP = 0; // m_nServerPort = 0; // } // SClient(uint32 nIP, uint16 nPort, uint32 nServerIP, uint16 nServerPort) { // m_nIP = nIP; // m_nPort = nPort; // m_nServerIP = nServerIP; // m_nServerPort = nServerPort; // } // friend __inline bool __stdcall operator==(const CSearchFile::SClient& c1, const CSearchFile::SClient& c2) { // return c1.m_nIP==c2.m_nIP && c1.m_nPort==c2.m_nPort && // c1.m_nServerIP==c2.m_nServerIP && c1.m_nServerPort==c2.m_nServerPort; // } // uint32 m_nIP; // uint32 m_nServerIP; // uint16 m_nPort; // uint16 m_nServerPort; //}; //此兩個結(jié)構(gòu)體表示了該搜索文件的可能來源,服務(wù)器或者其它客戶端 class CSearchList //是emule中的搜索列表,掌握所有的搜索請求(CSearchFile是列表中的元素,代表一次搜索的相關(guān)信息) //對外提供了搜索表達的接口,即每當有一個新的搜索提交時成員函數(shù)NewSearch會建立一個新的搜索項 //但是此時還沒有任何對應(yīng)的搜索文件,只是在文件個數(shù)和搜索id的對應(yīng)表(m_foundFileCount和m_foundSourceCount)中建立新的項目。 //該類還負責(zé)和搜索有關(guān)的信息的儲存和讀取,本身并不進行搜索 class CServer //服務(wù)器信息類 //ip地址 端口 以及屬性的個數(shù) …… //自定義的連接服務(wù)器的類 class CServerConnect //成員函數(shù)connectedsocket是CServerSocket類型(套接字)//成員保存若干CServerSocket類型的指針 //CMap<ULONG, ULONG, CServerSocket*, CServerSocket*> connectionattemps; //只是可以同時試圖連接到若干個服務(wù)器上//關(guān)鍵連接服務(wù)器(連接服務(wù)器的起點) // void CServerConnect::ConnectToServer(CServer* server, bool multiconnect, bool bNoCrypt) //{ // if (!multiconnect) { // StopConnectionTry(); // Disconnect(); // } // connecting = true; // singleconnecting = !multiconnect; // theApp.emuledlg->ShowConnectionState(); // // CServerSocket* newsocket = new CServerSocket(this, !multiconnect); // m_lstOpenSockets.AddTail((void*&)newsocket); // newsocket->Create(0, SOCK_STREAM, FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT, thePrefs.GetBindAddrA()); // newsocket->ConnectTo(server, bNoCrypt); // connectionattemps.SetAt(GetTickCount(), newsocket); //}//成員函數(shù) // void ConnectionEstablished(CServerSocket* sender); //tcp連接建立后的第一個包的發(fā)送,即向服務(wù)器發(fā)出登陸信息 //如果登陸成功,則能夠從服務(wù)器處獲取自己的id(32位) //自定義的連接服務(wù)器的類 class CServerConnect //成員函數(shù)connectedsocket是CServerSocket類型(套接字)//成員保存若干CServerSocket類型的指針 //CMap<ULONG, ULONG, CServerSocket*, CServerSocket*> connectionattemps; //只是可以同時試圖連接到若干個服務(wù)器上//關(guān)鍵連接服務(wù)器(連接服務(wù)器的起點) // void CServerConnect::ConnectToServer(CServer* server, bool multiconnect, bool bNoCrypt) //{ // if (!multiconnect) { // StopConnectionTry(); // Disconnect(); // } // connecting = true; // singleconnecting = !multiconnect; // theApp.emuledlg->ShowConnectionState(); // // CServerSocket* newsocket = new CServerSocket(this, !multiconnect); // m_lstOpenSockets.AddTail((void*&)newsocket); // newsocket->Create(0, SOCK_STREAM, FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT, thePrefs.GetBindAddrA()); // newsocket->ConnectTo(server, bNoCrypt); // connectionattemps.SetAt(GetTickCount(), newsocket); //}//成員函數(shù) // void ConnectionEstablished(CServerSocket* sender); //tcp連接建立后的第一個包的發(fā)送,即向服務(wù)器發(fā)出登陸信息 //如果登陸成功,則能夠從服務(wù)器處獲取自己的id(32位) class CServerSocket : public CEMSocket //它比CEMSocket要多保存一些狀態(tài) 比如:當前服務(wù)器連接狀態(tài)、當前所有連接的服務(wù)器的信息//成員函數(shù) //bool ProcessPacket(const BYTE* packet, uint32 size, uint8 opcode); //直接把emule客戶端和服務(wù)器之間的通信協(xié)議(服務(wù)器發(fā)回的包) class CUDPSocket : public CAsyncSocket, public CEncryptedDatagramSocket, public ThrottledControlSocket // ZZ:UploadBandWithThrottler (UDP) //UDP協(xié)議的包,因為UDP本來就是以一個包一個包作為單位在網(wǎng)絡(luò)上流傳的,不需要在包的內(nèi)容中再包含表示長度的字段 //每個UDP包的第一字節(jié)是協(xié)議族代碼,其它內(nèi)容就是包的內(nèi)容。 class CUpDownClient : public CObject //表示了一個客戶端的信息,即負責(zé)從邏輯上對網(wǎng)絡(luò)另一邊的一個客戶端進行表達 //該類是emule中代碼量最大的類 //BaseClient.cpp實現(xiàn)該類基本的各種狀態(tài)信息的獲取或設(shè)置,以及按照要求處理和發(fā)送處理請求 //邏輯實現(xiàn)和網(wǎng)絡(luò)進行了區(qū)分,該類本身不從網(wǎng)絡(luò)接收或者發(fā)送消息,它只是提供各種請求的處理接口,以及在發(fā)送請求時構(gòu)造好相應(yīng)的packet //并交給自己對應(yīng)的網(wǎng)絡(luò)套接字發(fā)送出去 //DownloadClient.cpp中實現(xiàn)該類的,和下載相關(guān)的功能,它還包括了各種下載請求的發(fā)送以及響應(yīng)的數(shù)據(jù)的接收 //UploadClient.cpp中實現(xiàn)該類的,和上傳相關(guān)的功能,即接受進來的下載請求,并且生成響應(yīng)的文件塊發(fā)送出去。 class CUploadQueue //上傳隊列類 //這個列表類中只有以CUpDownClient為元素的列表,它和其它列表類還有一個很大的不同,就是它所保存的信息都不需要持久化 //即不需要在當前的emule退出后還得記錄自己正在給誰上傳 //當收到一個新的下載請求后,它會把對應(yīng)的客戶端先添加到排隊列表中,以后再根據(jù)情況把他們不斷添加到上傳列表中,在這里,信譽機制將會 //對此產(chǎn)生影響//添加和刪除客戶端的上傳列表。這也使得確保所有的上傳槽的插座總是有足夠的數(shù)據(jù)包隊列,etc.This方法被稱為約為每100毫秒。 //向上傳隊列中的所有客戶端移除發(fā)送數(shù)據(jù),而排隊的客戶端是不會得到這個機會的 //它還需要完成關(guān)于上傳方面的統(tǒng)計信息 //void CUploadQueue::Process() { // // DWORD curTick = ::GetTickCount(); // // UpdateActiveClientsInfo(curTick); // // if (ForceNewClient()){ // //沒有足夠的開放上傳 // AddUpNextClient(_T("Not enough open upload slots for current ul speed")); // } // // // 循環(huán)上傳通道的數(shù)據(jù)。 // POSITION pos = uploadinglist.GetHeadPosition(); // while(pos != NULL){ // // 獲取客戶端 // CUpDownClient* cur_client = uploadinglist.GetNext(pos); // if (thePrefs.m_iDbgHeap >= 2) // ASSERT_VALID(cur_client); // //可以停留在上次上傳的位置 // if (!cur_client->socket) // { // RemoveFromUploadQueue(cur_client, _T("Uploading to client without socket? (CUploadQueue::Process)")); // if(cur_client->Disconnected(_T("CUploadQueue::Process"))){ // delete cur_client; // } // } else { // cur_client->SendBlockData(); // } // } // // // 保存使用的帶寬速度計算 // uint64 sentBytes = theApp.uploadBandwidthThrottler->GetNumberOfSentBytesSinceLastCallAndReset(); // avarage_dr_list.AddTail(sentBytes); // m_avarage_dr_sum += sentBytes; // // (void)theApp.uploadBandwidthThrottler->GetNumberOfSentBytesOverheadSinceLastCallAndReset(); // // avarage_friend_dr_list.AddTail(theStats.sessionSentBytesToFriend); // // //節(jié)省時間 // avarage_tick_list.AddTail(curTick); // // // don't save more than 30 secs of data // while(avarage_tick_list.GetCount() > 3 && !avarage_friend_dr_list.IsEmpty() && ::GetTickCount()-avarage_tick_list.GetHead() > 30*1000) { // m_avarage_dr_sum -= avarage_dr_list.RemoveHead(); // avarage_friend_dr_list.RemoveHead(); // avarage_tick_list.RemoveHead(); // } // // if (GetDatarate() > HIGHSPEED_UPLOADRATE_START && m_hHighSpeedUploadTimer == 0) // UseHighSpeedUploadTimer(true); // else if (GetDatarate() < HIGHSPEED_UPLOADRATE_END && m_hHighSpeedUploadTimer != 0) // UseHighSpeedUploadTimer(false); //}; class CUrlClient : public CUpDownClient //利用http協(xié)議對原有的emule協(xié)議進行包裝,以便使它能夠盡可能地穿越更多的網(wǎng)絡(luò)的防火墻 class CWebServer //能夠在本地打開一個web服務(wù)器,然后通過瀏覽器來控制你的emule class Packet //emule的通信協(xié)議的最小單位,例如:一個頭部信息的緩沖區(qū)、指定協(xié)議簇代碼等 //它內(nèi)部實現(xiàn)了壓縮和解壓的方法,該方法直接調(diào)用Zlib庫中的壓縮方法,可以減少數(shù)據(jù)的傳輸量 //這里要注意的一點的就是壓縮的時候協(xié)議簇代碼是不參與壓縮的,壓縮完畢后會更改協(xié)議簇代碼 class ThrottledControlSocket //任何其它的網(wǎng)絡(luò)套接字類如果想實現(xiàn)限速的功能,只需要在 //其默認的發(fā)送函數(shù)(Send或Sendto)中不發(fā)送數(shù)據(jù)而是把數(shù)據(jù)緩沖起來 //然后在實現(xiàn)接口SendFileAndControlData或SendControlData方法時才真正把數(shù)據(jù)發(fā)送出去

class UploadBandwidthThrottler :public CWinThread //一個CWinThread的子類,平時單獨運行一個線程,控制全局的上傳速度的 //在RunInteral中計算本次分配額(能夠發(fā)送多少字節(jié))、計算本次應(yīng)該睡眠多少時間(限速) //操作控制信息隊列,發(fā)送該隊列中的數(shù)據(jù) //注意,該控制隊列中的套接字(m_ControlQueueFirst_list和m_ControlQueue_list)只使用一次就離開隊列 //而標準隊列中的套接字不會這樣,在一輪循環(huán)結(jié)束后如果還有沒有用完的發(fā)送數(shù)據(jù)的配額,則會有部分配額保存到下一輪 //在標準隊列m_StandardOrder_list里面排隊的都是實現(xiàn)了ThrottledFileSocket接口的類,通過這些類能夠傳輸文件的內(nèi)容和控制信息//把要添加到隊列的套接字全部添加到兩個臨時隊列 然后根據(jù)它們的優(yōu)先級添加到普通的臨時隊列 //UploadBandwidthThrottler使用了兩個臨界區(qū)、兩個事件來暫停整個循環(huán)和線程 //void UploadBandwidthThrottler::QueueForSendingControlPacket(ThrottledControlSocket* socket, bool hasSent) { // // Get critical section // tempQueueLocker.Lock(); // // if(doRun) { // if(hasSent) { // m_TempControlQueueFirst_list.AddTail(socket); // } else { // m_TempControlQueue_list.AddTail(socket); // } // } // // // End critical section // tempQueueLocker.Unlock(); //} 源碼較多,學(xué)習(xí)難度大,沒那么多時間咬代嚼碼!難度大的不僅僅是代碼多、復(fù)雜,更重要的是它的協(xié)議。如果你完全明白了,那你就是牛人,像牛一樣辛苦的人,o(∩_∩)o 哈哈!~

學(xué)習(xí)的目標是成熟!~~~~


總結(jié)

以上是生活随笔為你收集整理的开源项目之电驴emule的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

成人一级片在线观看 | 午夜国产福利在线 | 久久精品美女视频网站 | 在线视频在线观看 | 91精品国产乱码久久桃 | 久久黄色免费观看 | 成人在线网站观看 | 久久激情五月激情 | 狠狠躁日日躁狂躁夜夜躁av | 久久久久免费网 | 欧美在线视频精品 | 天天五月天色 | 不卡的一区二区三区 | 韩国av免费在线观看 | 国产探花在线看 | 婷婷六月天天 | 久99久视频 | 国产色 在线 | 中文字幕一区二区三区乱码在线 | 日本精品视频网站 | 91av在线电影 | 婷婷草 | 久草精品网 | 手机看片国产日韩 | av免费在线播放 | 色哟哟国产精品 | 伊人影院在线观看 | 国际精品久久久久 | 超碰人人草 | 国产69精品久久久久久久久久 | 蜜桃视频日本 | 五月婷婷中文网 | 婷婷亚洲最大 | 国产一级片一区二区三区 | 久久国内精品 | 国产电影黄色av | 国产亚洲精品久久久久久无几年桃 | 国产色综合天天综合网 | 丁香午夜| 美女视频黄色免费 | 亚洲成色777777在线观看影院 | 成人中文字幕在线观看 | 日本三级中文字幕在线观看 | 最新日韩在线观看 | 99国产精品 | 日本久久久久久久久久 | 久久九九国产精品 | 97色狠狠 | 99爱精品视频 | av成年人电影| 福利一区二区三区四区 | 色综合久久精品 | 国产群p | 久久香蕉电影 | 中文字幕精品久久 | 91精品一区二区三区蜜臀 | 亚洲精品在线免费观看视频 | 91精品办公室少妇高潮对白 | 久久亚洲精品电影 | 天天插天天狠 | 337p日本大胆噜噜噜噜 | 欧美激情xxxx| 伊人婷婷在线 | 久久av高清 | 日韩电影久久 | av在观看| 国产美女无遮挡永久免费 | 91九色网址| 亚洲成人欧美 | 国产精品尤物视频 | 国产精品久久网站 | 久久精品综合视频 | 国产自在线 | 国产一区黄色 | 日韩在线二区 | 欧美视频在线观看免费网址 | 亚洲va欧美va人人爽 | 超碰人人舔 | 九九综合久久 | 日韩三级在线 | 伊人激情网| 成人91在线观看 | 成人免费在线视频观看 | 在线免费视频 你懂得 | 午夜视频免费播放 | 99视频精品全部免费 在线 | 国产日产精品一区二区三区四区的观看方式 | 日韩电影在线观看一区 | www在线免费观看 | 超碰个人在线 | 在线成人国产 | 免费黄色a级毛片 | 亚洲精品自在在线观看 | 精品久久1 | 国产一区二区三区高清播放 | 日日爱av | 中文字幕一区二区三区乱码在线 | 天天草综合网 | av大片免费在线观看 | 五月婷婷精品 | 色丁香综合 | 视频二区 | 色婷婷在线播放 | 天天干天天草天天爽 | 国内精品亚洲 | 91在线视频导航 | 五月综合久久 | 日韩欧美在线一区二区 | 国产精品成人一区二区 | 久久九九影视网 | 欧美日本不卡高清 | 99久久精品国产一区 | 国产成免费视频 | 亚洲日本成人网 | 五月激情片 | 色噜噜日韩精品一区二区三区视频 | 中文字幕免费高清av | 精品久久久久久久久中文字幕 | 精品国产aⅴ麻豆 | 成人h动漫精品一区二 | 国产精品视频免费看 | 日韩午夜精品福利 | 亚洲一级电影 | 国产精品免费久久久久影院仙踪林 | 久久久久亚洲精品中文字幕 | 亚洲精品乱码久久久久久久久久 | 久久久精品 一区二区三区 国产99视频在线观看 | 黄色免费大片 | 免费视频国产 | 免费a现在观看 | 丁香影院在线 | 免费h漫在线观看 | 欧美91片 | 免费av观看| 黄色精品久久 | 91av视频在线播放 | 国产精品久久综合 | 久久超| 日日干 天天干 | 日韩久久精品一区二区 | 欧美日韩不卡在线观看 | www.色五月| 中文永久免费观看 | 久久超碰免费 | 色婷婷综合久久久中文字幕 | 婷婷丁香在线观看 | 最新中文字幕在线观看视频 | 日躁夜躁狠狠躁2001 | 中文字幕一区二区三区乱码不卡 | 婷婷新五月 | 国产成人a亚洲精品 | 免费看的国产视频网站 | 国产午夜精品视频 | 日本天天色 | 欧美精品久久久久久久久久 | 99视频精品全部免费 在线 | 麻豆精品视频在线观看免费 | 国产xvideos免费视频播放 | av大全免费在线观看 | 日韩专区一区二区 | 久热香蕉视频 | 久久激情片 | 天天se天天cao天天干 | 一区二区三区四区久久 | 美女网站在线 | 国产91勾搭技师精品 | 亚洲精品久久久久久久不卡四虎 | 国产精品美女在线观看 | 天天色中文 | 美女久久精品 | 国产精品欧美久久久久三级 | 久久91久久久久麻豆精品 | 亚洲一区av| 日韩视频1 | 中文字幕综合在线 | 欧美一区二区视频97 | 欧美日韩精品在线观看视频 | 国产精品一区二区三区电影 | 免费久久久久久 | 精品夜夜嗨av一区二区三区 | 最近中文字幕免费视频 | 69热国产视频 | 特级毛片爽www免费版 | av免费在线免费观看 | 久久久免费精品视频 | 久久免费视频在线观看 | av导航福利 | 亚洲欧美视频在线 | 日韩高清av在线 | 日韩黄色一级电影 | 黄色一级大片在线免费看国产一 | 亚洲香蕉在线观看 | 麻豆国产精品视频 | 在线免费看黄色 | 1000部18岁以下禁看视频 | 久久免费a| 日韩av专区| 国产福利在线免费 | 久久久久久久av麻豆果冻 | 天天曰天天 | av国产在线观看 | 亚洲综合在线一区二区三区 | 国产成人777777 | 亚洲视频,欧洲视频 | 亚洲视频观看 | 黄av免费 | 天天曰天天射 | 日韩三级.com | 婷婷性综合 | 国产成人三级在线 | 青青五月天 | 99色在线播放 | 精品国产一区二区三区久久 | 精品在线观看免费 | 国产日产欧美在线观看 | 中文字幕在线观看一区二区三区 | 天天干,夜夜爽 | 亚洲黄色片在线 | 亚洲婷婷在线 | 91干干干| 手机在线永久免费观看av片 | 久久久亚洲电影 | 亚洲精品一区二区18漫画 | 天天操天天爽天天干 | 国产精品一级在线 | 欧美黑人性猛交 | 日韩黄色在线电影 | 日韩精品一区二区三区第95 | 国产精品永久久久久久久久久 | 五月激情在线 | 日韩高清一二三区 | 九九视频网站 | 久久成人在线视频 | 成人影音在线 | 午夜精品婷婷 | 精品一区二区6 | 亚洲狠狠婷婷 | 狂野欧美激情性xxxx欧美 | 天天干天天草 | www久久国产 | 精品久久久久久久久亚洲 | 国产成人一级 | 四虎影视成人永久免费观看亚洲欧美 | 久久久久麻豆v国产 | av大片免费看 | 久草剧场| 国产福利在线免费 | 色婷婷a | 成人免费在线网 | 毛片永久新网址首页 | 亚洲最大成人免费网站 | 久久天天操 | 91高清免费 | 日韩美在线观看 | 成人性生活大片 | 亚洲精品mv在线观看 | 久久成人在线视频 | 亚洲第一香蕉视频 | 四虎成人精品 | 成人在线电影观看 | 国产成人免费av电影 | 国产亚洲精品精品精品 | 久久久久女教师免费一区 | 国产免费二区 | 中文字幕免费成人 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲国产97在线精品一区 | av中文字幕不卡 | 久久久影院官网 | 伊人五月天婷婷 | 日本一区二区三区免费看 | 999视频在线播放 | 亚洲高清视频在线播放 | 在线观看黄色的网站 | 久久久免费 | 国产永久免费观看 | 中文字幕三区 | 丁香电影小说免费视频观看 | 中文字幕黄色 | 99精品热| 国产精品 久久 | 久久亚洲在线 | 国产精品黄网站在线观看 | 丁香九月激情综合 | 国产一级免费电影 | 亚洲激情在线观看 | 天天草视频| 国产免费观看久久 | 国产一级片在线播放 | 日韩中文在线观看 | 久久视屏网 | 操高跟美女 | 亚洲综合精品视频 | 91精品亚洲影视在线观看 | 国产午夜三级一区二区三 | 97人人超| 日韩在线观看精品 | www.com黄色| 日本中文字幕在线免费观看 | 麻豆国产视频 | 久久久免费网站 | 国产精品一区二区在线免费观看 | 欧美色图视频一区 | 亚洲一区动漫 | 亚洲黄色软件 | 亚洲天堂色婷婷 | 中文字幕123区 | 中文字幕精品一区二区精品 | 欧美少妇xxx | 日躁夜躁狠狠躁2001 | 免费观看91视频大全 | 国产精品高潮呻吟久久av无 | 91爱爱视频 | 欧美一区三区四区 | 中文国产字幕在线观看 | 中文字幕在线视频一区二区 | japanesexxxhd奶水 国产一区二区在线免费观看 | 国产黄在线看 | 免费在线观看污网站 | 天天拍天天干 | 六月丁香在线视频 | 高潮久久久 | 亚洲伊人成综合网 | 天天操操操操操操 | 不卡av电影在线 | 国产很黄很色的视频 | av夜夜操 | 国产精品一区二区av麻豆 | 国产日韩高清在线 | 亚欧日韩成人h片 | 99精品视频一区二区 | 日韩视频www | 综合色久| 毛片一区二区 | 狠狠干夜夜爽 | 亚洲精品国产精品国 | 亚洲乱码国产乱码精品天美传媒 | 国产一性一爱一乱一交 | 国产精品久久久久久久久搜平片 | 婷婷在线视频 | 国产精品96久久久久久吹潮 | 99视频播放| 欧美日韩不卡一区二区三区 | 干干夜夜 | 国产高清视频在线播放 | 夜夜天天干 | 国产又粗又硬又长又爽的视频 | 精品国产欧美一区二区三区不卡 | 狠狠狠狠狠狠狠干 | 97精品电影院| 亚洲一区精品二人人爽久久 | www.人人干 | 在线观看免费色 | 天天弄天天干 | 免费一级片久久 | 免费看色的网站 | 中国一级片免费看 | 天天曰天天| 免费在线观看91 | 国产高清视频 | 丁香婷五月 | 成年人黄色在线观看 | av理论电影 | 中文字幕在线播放日韩 | 丁香婷婷色综合亚洲电影 | 久久精品女人毛片国产 | 久久精品久久久久久久 | 在线观看黄色小视频 | 欧美日韩国产精品一区二区三区 | 麻豆国产露脸在线观看 | av在线不卡观看 | 免费在线a | 国产精品高潮久久av | 国产在线2020 | 国产日韩欧美视频在线观看 | 伊人国产视频 | 九九综合在线 | 91精品夜夜 | 久久 在线 | 久久精品视频网 | 狠狠色丁香婷婷 | 日b视频在线观看网址 | 高清视频一区二区三区 | 黄色a在线 | 中文高清av | 成人91免费视频 | 日韩午夜一级片 | 国内精品美女在线观看 | 亚洲 综合 精品 | 一区二区久久久久 | 久久久人人人 | 91精品久久久久久久久久久久久 | 三级黄色大片在线观看 | 91精品国产乱码 | 97人人模人人爽人人喊网 | 在线观看亚洲精品 | 国产亚洲va综合人人澡精品 | 欧美精品久久久久久久亚洲调教 | 色欧美视频 | 插婷婷| 久久黄色网址 | 中文字幕人成乱码在线观看 | 国产剧情一区 | 久久1电影院 | 国产成人精品免高潮在线观看 | 日韩在线视频网 | 999电影免费在线观看 | 国产 在线观看 | 99精品视频在线播放免费 | 国产福利91精品张津瑜 | 日本三级中文字幕在线观看 | 激情网在线观看 | 国产色婷婷在线 | 国产在线自 | 免费网站黄 | 成年人在线观看 | 日韩高清精品免费观看 | 日韩性网站| 欧美成人黄色 | 免费黄色av电影 | 最新日韩视频在线观看 | 五月婷婷丁香六月 | 久久久电影网站 | 玖玖玖影院 | 四虎在线免费观看 | 新av在线 | 99一区二区三区 | 狠狠的干狠狠的操 | 91麻豆精品国产自产在线 | 成人一级在线 | 99久久日韩精品视频免费在线观看 | 午夜久久 | 婷婷色网站 | 国产精品久久久久久久久久三级 | 日韩在线视频线视频免费网站 | www.国产视频 | 字幕网资源站中文字幕 | 日韩免费在线观看网站 | 日韩久久精品一区二区三区下载 | 国产福利一区二区三区在线观看 | 亚洲 欧美 精品 | 亚洲三级在线播放 | 久久精品8 | 在线免费黄网站 | 欧美综合在线视频 | 91精品蜜桃 | 美女黄频网站 | 国产一区免费观看 | 91高清免费在线观看 | 有码中文字幕 | av福利超碰网站 | 国产欧美综合视频 | 2019中文最近的2019中文在线 | 国产资源中文字幕 | 日韩精品短视频 | 天天操天天玩 | 国产香蕉视频 | 99婷婷狠狠成为人免费视频 | 九九综合久久 | 国产精品免费看 | 久久69精品| 丁香综合五月 | 一区二区视频在线播放 | 人人射人人澡 | a v在线观看 | 国产美女精品视频免费观看 | 人成免费网站 | 久久91久久久久麻豆精品 | 欧美国产日韩一区二区三区 | 中文字幕久久精品亚洲乱码 | 精品视频免费在线 | 色狠狠婷婷 | 玖草影院| 国产成人精品一区二区三区在线 | 国产一区视频在线 | 国产欧美精品在线观看 | 日韩在线观看免费 | 亚洲国产天堂av | 日韩有码欧美 | 日韩在线观看你懂得 | 亚洲国产精彩中文乱码av | 亚洲三级黄色 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美国产亚洲精品久久久8v | 91精品一区二区三区蜜桃 | 91精品999 | 亚洲精品国偷自产在线99热 | 国产99久久久国产精品免费二区 | 毛片美女网站 | 天天综合久久 | 久久新| 九九综合九九 | 亚洲精品网站在线 | av资源免费看| 99日韩精品 | 91视频免费看片 | 日韩在线观看一区二区三区 | 日韩色在线观看 | 丁香久久婷婷 | 国产明星视频三级a三级点| 粉嫩高清一区二区三区 | 中文字幕日韩精品有码视频 | 久草网在线观看 | 国产片免费在线观看视频 | 久久久久亚洲精品国产 | 中文字幕区 | 四虎影视成人永久免费观看亚洲欧美 | 精品视频在线视频 | 中文字幕二区在线观看 | 午夜10000| 日韩欧美国产成人 | 91av视频播放 | 欧美日韩国产页 | 国产99久久久国产精品免费看 | 久久久久久久久久久久av | 综合久久一本 | 国产资源免费在线观看 | 中日韩免费视频 | 人人爽人人干 | 亚洲婷婷免费 | 久久精品久久国产 | 日韩av不卡在线观看 | 国产黄色免费看 | 久久免费久久 | 天天草天天色 | 黄色日本免费 | 亚洲特级片 | 久久精品久久久精品美女 | 91色在线观看视频 | 人人爱在线视频 | 日韩av在线影视 | 日韩在线视频免费观看 | 91亚洲国产成人 | 91精品国自产在线偷拍蜜桃 | 91精品91| wwwwww色 | 四虎精品成人免费网站 | 日本在线观看黄色 | 日韩一区二区三免费高清在线观看 | 精品成人a区在线观看 | 成人片在线播放 | 99九九免费视频 | 最新国产精品亚洲 | 五月开心婷婷网 | 日韩欧美视频一区二区 | 国内精品视频一区二区三区八戒 | 日本公乱妇视频 | 日韩a免费| 人人爱人人添 | 国产精品入口66mio女同 | 人人舔人人 | 国产精品福利在线观看 | 国产精品自在线拍国产 | www.亚洲黄| 日韩av男人的天堂 | 国产一级视屏 | 亚洲国产高清在线观看视频 | 久久久久久高潮国产精品视 | 尤物97国产精品久久精品国产 | 久草在线视频免费资源观看 | 久久看片网站 | 91av视频观看 | 国产精品电影一区 | 狠狠色丁香婷婷综合久小说久 | 国产麻豆视频网站 | 看av免费网站| 精品一二三四在线 | 玖玖在线免费视频 | 久久婷婷久久 | 日韩精品中文字幕在线观看 | 久久伦理电影网 | 丰满少妇麻豆av | 99久久久国产精品免费99 | 国产在线高清视频 | 成人av在线观 | 人人爽久久久噜噜噜电影 | 国产在线观看a | 欧美综合色在线图区 | 国产精品99久久99久久久二8 | av大全在线观看 | 久久看片 | 免费av视屏 | 亚洲老妇xxxxxx | 欧美一区日韩精品 | 久草在线国产 | 最近乱久中文字幕 | 亚洲国产精品资源 | 精品伦理一区二区三区 | 久久国产精品久久久 | 视频一区视频二区在线观看 | 国产黄色播放 | 国产伦理久久精品久久久久_ | 在线视频1卡二卡三卡 | 成人在线免费看视频 | 色视频在线| 国产精品 日韩 欧美 | 国产午夜免费视频 | 国产在线a | 99热在线看| 99爱视频在线观看 | 国产精品国产三级国产aⅴ无密码 | 伊人资源视频在线 | 日韩欧美一区二区不卡 | 人人澡人人模 | 激情综合六月 | 国产91精品高清一区二区三区 | 久草在线视频精品 | 综合激情婷婷 | 操操操人人人 | 91久久电影 | 精品视频999| 日韩中文在线字幕 | 一区二区精品在线视频 | 在线看黄网站 | 99久久精品午夜一区二区小说 | 亚洲国产字幕 | 欧美精品免费在线观看 | 又黄又爽又色无遮挡免费 | 日本久久精品视频 | 欧美a级在线免费观看 | 91亚洲精| 麻豆精品视频 | 欧美性色19p| 久久久久激情 | 国产96在线观看 | 中文字幕亚洲欧美日韩2019 | 天天综合日日夜夜 | 亚洲欧美日韩在线看 | 欧美亚洲成人xxx | 99久久精品免费看国产四区 | 深爱激情五月婷婷 | 精品国产成人在线 | 91热视频| 一区二区视频播放 | 午夜av免费观看 | 顶级欧美色妇4khd | 日本中文字幕影院 | 国产剧情一区在线 | 婷婷色网视频在线播放 | 97香蕉超级碰碰久久免费软件 | 日韩电影在线视频 | 午夜色场 | 精品高清美女精品国产区 | 日韩成人在线一区二区 | 久久综合9988久久爱 | 激情开心色 | 4p变态网欧美系列 | 久色小说| 中文字幕在线乱 | 五月婷婷六月丁香激情 | 毛片网站在线看 | 亚洲国产精品第一区二区 | 久久精品一区二区三 | 国产剧情av在线播放 | 国产精品永久免费在线 | 日韩色高清 | 在线国产日本 | 免费av观看网站 | 激情五月伊人 | 亚洲精品在线免费看 | 亚洲精品视频在线观看免费 | 国产91免费在线观看 | 中文字幕在线观看视频一区二区三区 | 在线观看视频三级 | 五月婷婷播播 | 欧美污污网站 | 91九色网站 | 五月天综合网站 | 国产女教师精品久久av | 亚洲精品成人av在线 | 91香蕉亚洲精品 | 伊人视频 | 97中文字幕 | 久久精品视频4 | 亚洲黄色小说网 | 国产福利电影网址 | 六月丁香激情综合色啪小说 | 久99久精品视频免费观看 | 天海翼一区二区三区免费 | 亚洲成av人片在线观看 | 色综合亚洲精品激情狠狠 | 在线观看免费 | 久久久久高清 | 91一区在线观看 | 成人久久18免费网站图片 | 亚洲一区美女视频在线观看免费 | 日本久热 | 中文资源在线播放 | 精品999| 91在线播放视频 | 国产剧情一区二区 | 久久久久久免费毛片精品 | 日韩精品在线视频免费观看 | 国产精品 欧美 日韩 | 五月婷综合 | 久久精品国产久精国产 | 黄色软件网站在线观看 | 天天想夜夜操 | 免费www视频 | av福利网址导航大全 | 在线观看精品黄av片免费 | 免费大片黄在线 | 999久久a精品合区久久久 | 91久久一区二区 | 久久成人国产精品免费软件 | 欧美精品久久久久 | 国产亚洲精品综合一区91 | 国产午夜精品一区二区三区 | 色福利网 | 激情开心站 | 久久久国产精品亚洲一区 | 综合国产视频 | 国产999久久久 | 久久久午夜视频 | 99在线看| 91九色porny蝌蚪视频 | 久草免费福利在线观看 | 欧美激情视频在线免费观看 | 久久久精品 一区二区三区 国产99视频在线观看 | 亚洲精品国 | 国产专区精品视频 | 久久精品这里精品 | 中文字幕色网站 | 日韩网| 国产精品热视频 | 99色资源| 久久精品中文字幕免费mv | 精品久久福利 | 日韩电影精品 | 91九色精品女同系列 | 99久久婷婷国产综合亚洲 | 国产精品国产三级国产 | 久久在线视频精品 | 久草久草视频 | 久久99热精品 | 成人免费在线播放 | 免费看成人 | 特黄免费av | 精品免费久久久久久 | 欧美动漫一区二区三区 | 久久久久久毛片精品免费不卡 | 三级午夜片 | 国产福利在线不卡 | 91免费版在线观看 | 91精品免费 | 欧美乱熟臀69xxxxxx | 亚洲国产精品女人久久久 | 亚洲小视频在线观看 | 狠狠的操你 | 天天干天天拍天天操天天拍 | 亚洲精品免费在线观看 | 成人久久亚洲 | 91精品视频播放 | 欧美在线观看视频一区二区三区 | 亚洲高清视频在线播放 | 久久99偷拍视频 | 在线看国产 | 国产va饥渴难耐女保洁员在线观看 | 成年人免费在线看 | 五月天激情在线 | 日本黄色片一区二区 | 丁香六月激情婷婷 | 亚洲视频观看 | 亚洲精品永久免费视频 | 亚洲第二色| 香蕉视频在线网站 | 日韩中文字幕91 | 三级大片网站 | 精品久久久久久亚洲 | 天天玩天天干天天操 | 免费视频网 | 精品黄色在线观看 | 久久久不卡影院 | 在线中文字幕视频 | 国产精品一区在线观看你懂的 | 国产视频一区二区三区在线 | 欧美精品xxx| 国产精品麻豆一区二区三区 | 日韩久久久久久久久久久久 | 国产精品99久久久久的智能播放 | 欧美精品国产综合久久 | 精品久久久久久国产偷窥 | 国产黄色精品视频 | 色多多视频在线观看 | 国产小视频在线播放 | 精品亚洲一区二区三区 | 午夜婷婷在线播放 | 日韩在线三区 | 91在线九色 | 日韩在线免费电影 | 久久99久久99精品免观看粉嫩 | av片在线观看免费 | 久久影院精品 | 黄色av电影网 | 精品国产理论 | 午夜精品视频免费在线观看 | 国产成人精品一区二区三区在线 | 国产精品麻豆免费版 | 三级av免费| 国产精品国产三级国产不产一地 | 日韩一区二区三区高清在线观看 | 精品999国产| 亚洲欧洲国产日韩精品 | 人人干人人超 | 久久国产网 | 亚洲国产mv | 亚洲无线视频 | 精品免费国产一区二区三区四区 | 中文字幕高清视频 | 丁香婷婷综合激情五月色 | 麻豆一级视频 | 丁香六月婷婷开心 | 91男人影院 | 香蕉视频在线免费 | 午夜 在线 | free. 性欧美.com | 四季av综合网站 | 国产成人一区二区三区久久精品 | 三级在线视频播放 | 欧美99久久 | 欧美精品一区二区蜜臀亚洲 | 国产在线欧美在线 | 国产成人精品免高潮在线观看 | 色婷婷成人网 | 欧美激情精品久久久久久 | 国产中文字幕91 | 亚洲男男gaygay无套 | 2024国产精品视频 | 97在线观看免费观看 | 一区二区三区四区免费视频 | 色wwww| 免费观看全黄做爰大片国产 | 亚洲国产精品日韩 | 日韩精品一区二区三区免费视频观看 | 欧美激情综合色综合啪啪五月 | 亚洲精品国久久99热 | 日韩高清在线一区二区三区 | 日日干干夜夜 | 久久精品久久久精品美女 | 日韩成人xxxx| 亚洲最新精品 | 国产精品婷婷午夜在线观看 | 天天天天射| 久久久久久毛片精品免费不卡 | 成年人免费看 | 国产99久久精品一区二区永久免费 | 99精品国产视频 | 国产视频亚洲精品 | 亚洲女欲精品久久久久久久18 | 亚州激情视频 | 免费av在线| 国产一区视频免费在线观看 | 最新中文字幕在线观看视频 | 精品国产乱码久久久久久1区二区 | 婷婷 综合 色 | 国产一区二区三区视频在线 | 久久999精品 | 精品国产一二三四区 | 日韩在线视频看看 | 国产一级做a爱片久久毛片a | 国产.精品.日韩.另类.中文.在线.播放 | 国产日韩欧美在线免费观看 | 午夜精品一区二区三区在线播放 | 精品免费久久久久 | 99国内精品 | 欧美激情综合五月色丁香 | 国产精品综合在线观看 | 超碰免费在线公开 | 国产精品视频地址 | 色在线免费观看 | 国产亚洲久一区二区 | 二区三区在线观看 | 中文字幕在线观看视频免费 | 亚洲精品国产第一综合99久久 | 免费高清在线视频一区· | 国产精品嫩草影院9 | 国产手机视频在线播放 | 亚洲国产成人久久综合 | 欧美精品在线免费 | 成 人 黄 色 视频免费播放 | 91av视频在线免费观看 | 99久久久国产精品免费99 | 免费欧美高清视频 | 久久久精品二区 | 亚洲国产成人在线观看 | 久久久麻豆精品一区二区 | 男女激情片在线观看 | 91久久丝袜国产露脸动漫 | 国产又粗又猛又爽又黄的视频先 | 四虎8848免费高清在线观看 | 国产精品video爽爽爽爽 | 久久人人爽av | 久久综合射 | 91人人澡人人爽人人精品 | 亚洲精品福利在线观看 | 日韩视频免费观看高清 | 91色网址| 可以免费观看的av片 | 综合久久久久久 | 99热这里| 午夜久久久久久久 | 久久久久免费观看 | 一区二区欧美激情 | 亚洲日韩精品欧美一区二区 | 久久狠狠亚洲综合 | 福利视频网址 | 久久亚洲欧美日韩精品专区 | 国产91精品一区二区 | 精品在线小视频 | 国产视频精品久久 | 久久精品亚洲精品国产欧美 | 97视频人人免费看 | 久草在线免费资源站 | 成人av.com| 精品免费视频123区 午夜久久成人 | 狠狠躁夜夜a产精品视频 | 在线看片中文字幕 | 色综合 久久精品 | 最新av电影网址 | 久久中文字幕导航 | 96av视频| 国产精品岛国久久久久久久久红粉 | 超碰在线免费97 | www操操| 4438全国亚洲精品在线观看视频 | 久久久久久久久久久成人 | 国产精品久久久久久久久蜜臀 | 久久99久久99精品中文字幕 | 亚洲欧美精品一区 | 国产精品片 | 人人要人人澡人人爽人人dvd | 国产精品久久久久久久午夜片 | 综合天天网 | 99色资源 | 日韩精品视频一二三 | 亚洲精品777 | 色综合天天干 | 中文字幕在线观看一区二区 | 啪嗒啪嗒免费观看完整版 | 亚洲天天在线日亚洲洲精 | 国产小视频免费在线网址 | 日韩中文字幕免费在线播放 | 久久看看| 成人av免费网站 | 男女拍拍免费视频 | 日日干,天天干 | 亚洲综合成人av | 日韩素人在线观看 | 91成人在线视频 | 国产在线中文字幕 | 天堂久久电影网 | 一区二区三区四区五区六区 | 天天综合网在线观看 | 国产精品久久久久免费观看 | 日韩久久精品一区二区三区 | 国产在线传媒 | 国产精品婷婷午夜在线观看 | 91久久久久久国产精品 | 激情综合网天天干 | 精品欧美一区二区在线观看 | 九九精品毛片 | 麻豆视频在线观看免费 | 成人免费看视频 | 中文字幕日本电影 | 免费在线观看的av网站 | 国产99中文字幕 | 国产精品美女久久久久久久 | 久视频在线 | 亚洲国产视频网站 | av一区二区三区在线 | 天天干天天弄 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 久久亚洲二区 | 欧美亚洲精品一区 | 久青草国产在线 | 精品99在线视频 | 国产亚洲精品bv在线观看 | 天天色 天天 | 亚洲伦理一区 | 亚洲精品在线一区二区 | 激情婷婷网 | 综合久久久久久 | 国产精品亚洲片夜色在线 | 成人a级网站 | 中文字幕黄网 | 国产精品理论片在线观看 | 亚洲婷婷综合色高清在线 | 亚洲伦理电影在线 | 久久大香线蕉app | 久久久久高清 | 天天干,天天草 | 国产护士在线 | 久久九九视频 | 天天操天天吃 | 天天操天天曰 | 99热这里只有精品国产首页 | 欧美成人tv| 国产成人333kkk |