亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? emule源代碼解析-2.txt

?? 電驢開發書籍 eMule是一個典型的MFC程序
?? TXT
字號:
eMule源代碼解析 -2 2006-10-16 17:4

1分塊機制--正確傳輸資源的保證 為了加快內容分發的速度,分塊處理是一種簡單有效的方法。emule中對每個文件都進行了分塊處理。另外分塊還有一個好處就是如果保留了每一分塊的hash值,就能在只下載到文件的一部分時判斷出下載內容的有效性。

emule在獲取每個共享文件的信息時,就對它進行了分塊處理,因此如果要知道emule中的分塊處理和恢復機制,看CKnownFile::CreateFromFile函數的實現就行了。 

這個函數中牽涉到的和分塊處理以及hash計算相關的類都在SHAHashSet.cpp和SHAHashSet.h中。

下面介紹其中幾個主要的類:

 CAICHHash類只負責一塊hash值,提供兩個CAICHHash類之間的直接賦值,比較等基本操作。CAICHHashAlgo是一個hash算法的通用的接口,其它hash算法只要實現這種接口都能使用,這樣,可以很方便得使用不同的hash算法來計算hash值。CAICHHashTree則是一個樹狀的hash值組織方式,它有一個左子樹和右子樹成員變量,類型是指向CAICHHashTree的指針,這是一個典型的實現樹狀結構的方法。CAICHHashSet中包含了一個CAICHHashTree類型的變量,它直接向CKnownFile負責,代表的是一個文件的分塊信息。 SHAHashSet.h文件的開始的注釋部分向我們解釋了它的分塊的方式。這里要用到兩個常量9728000和184320,它們分別是9500k和180k。這是emule中兩種不同粒度的分塊方式,即首先把一個很大的文件分割成若干個9500k的塊,把這些塊組織成一顆樹狀的結構,然后每一個這樣的塊又分解成若干個180k的塊(52塊,再加一個140k的塊),仍然按照樹狀的結構組織起來。最后總的結構還是一顆樹。 CKnownFile::CreateFromFile方法是在讀取目標文件的內容時,逐步建立起這樣一顆樹的。CAICHHashTree::FindHash能夠根據讀取到的目標文件的偏移量和下一塊的大小,來找出對應的樹枝節點(就是一個指向CAICHHashTree的指針)。如果有必要的話,還會自動創建這些樹枝節點。因此在進行分塊操作的時候,把文件從頭到尾讀一邊,整個CAICHHashTree就建立起來了,對應的分塊hash值也賦值好了。

最后我們還需要注意的就是CKnownFile類中的hashlist變量。就是說它還單獨保留直接以9728000字節為單位的所有分塊的MD4算法的hash值。這樣對于一個文件就有了兩套分塊驗證的機制,能夠適應不同場合 網絡基礎設施--網絡基礎設施的基礎設施 MFC中已經有一些網絡基礎設施類,如CAsyncSocket等。但是emule在設計中,為了能夠更加高效得開發網絡相關的代碼,構建了另外的一些類作為基礎設施,這些基礎設施類的代碼也有很高的復用價值。

 首先是CAsyncSocketEx類。AsyncSocketEx.h中對這個類的特點已經給出了一定的說明。它完全兼容CAsyncSocket類,即把應用程序中所以的CAsyncSocket換成CAsyncSocketEx,程序仍然能夠和原來的功能相同,因此在使用上更加方便。但是在這個基礎上,它的效率更高,主要是在消息分發機制上,即它處理和SOCKET相關的消息的效率要比原始的MFC的CAsyncSocket類更高。

另外,CAsyncSocketEx類支持通過實現CAsyncSocketExLayer類的方式,將一個SOCKET分成若干個層,從而可以很方便得實現許多網絡功能,如設置代理,或者是使用SSL進行加密等。 

另外還有ThrottledSocket.h中定義的ThrottledControlSocket類和ThrottledFileSocket類,這兩個類只定義了兩個接口。任何其它的網絡套接字類如果想實現限速的功能,只需要在其默認的發送函數(如Send或Sendto)中不發送數據而是把數據緩存起來,然后在實現ThrottledControlSocket或者ThrottledFileSocket接口中的SendFileAndControlData或SendControlData方法時才真正把數據發送出去,這樣就能實現上傳限速,而這也是需要UploadBandwidthThrottler類進行配合,UploadBandwidthThrottler是一個WinThread的子類,平時單獨運行一個線程。下一次會詳細描述它是如何控制全局的上傳速度的。 網絡基礎設施--全局限速器UploadBandwidthThrottler UploadBandwidthThrottler是emule中使用的全局的上傳限速器。它繼承了CWinThread類,且在該類被創建的時候,就新創建一個線程開始單獨運行。在該類被析構時也會自動停止相應的線程。這個線程的目標函數就是RunProc,然后為了避免在RunProc函數不能使用this指針的情況,它使用了RunInternal來實際完成工作線程的工作。在emule中,還有另外一個類LastCommonRouteFinder有類似的結構。 UploadBandwidthThrottler中保存了若干的套接字(Socket)隊列,這些隊列的處理方式略有不同。在標準隊列(m_StandardOrder_list)里面排隊的都是實現了ThrottledFileSocket接口的類,通常這些類能夠傳輸文件內容也可以傳輸控制信息。

而其它四個隊列都是實現ThrottledControlSocket接口的類的隊列,在這些隊列中的類主要以傳輸控制信息為主。

這四個隊列為臨時高優先級,臨時普通優先級,正式高優先級,正式普通優先級。和把套件字直接添加到普通隊列(AddToStandardList)不同,

QueueForSendingControlPacket把要添加到隊列的套接字全部添加到兩個臨時隊列。根據它們的優先級添加到普通的臨時隊列。在RunInternal的大循環中,臨時隊列中的項目先被移到普通隊列中,然后再進行處理。 

UploadBandwidthThrottler使用了兩個臨界區,兩個事件。pauseEvent是用來暫停整個大循環的動作的。而threadEndedEvent是標志整個線程停止的事件。sendLocker是大循環中使用的主要的臨界區,而tempQueueLocker是為兩個臨時隊列額外添加的鎖,這樣可以一邊發送已有隊列中的套界字要發送的數據,一邊把新的套接字加到隊列中。 

UploadBandwidthThrottler的RunInternal中的大循環是該工作線程的日常操作。這個大循環中做了以下事情,計算本次配額,即本次循環中能夠發送多少字節,好安排調度,計算本次循環應該睡眠多少時間,然后進行相應的睡眠,從而進行限速。操作控制信息隊列,發送該隊列中的數據,注意,控制隊列中的套接字(m_ControlQueueFirst_list和m_ControlQueue_list)只使用一次就離開隊列。而標準隊列中的套接字不會這樣。在一輪循環結束后,如果還有沒有用完的發送數據的配額,則會有部分配額保存到下一輪。 網絡基礎設施--emule套接字CEMSocket CEMSocket是CAsyncSocketEx和ThrottledFileSocket的子類,它把若干功能整合到了一起,因此可以作為emule使用起來比較方便的套接字。例如它可以很方便得指定代理,把CAsyncSocketEx中的創建一個新的代理層并且添加到列表中的功能對外屏蔽了。另外它可以分出狀態,如當前是否在發送控制信息等。

 CEMSocket中我們需要仔細考察的是它的SendControlData和SendFileAndControlData方法。如前所述,這些方法是用來和UploadBandwidthThrottler進行配合,以便完成全局的限速功能的。它的功能應該是按照UploadBandwidthThrottler的要求,在本次輪到它發送數據時發送指定數量的字節數。因此,應用程序的其它部分在使用CEMSocket時,如果要達到上傳數據限速的目的,不應該直接調用標準的Send或者SendTo方法,而是調用SendPacket。這里就有了另外一個結構Packet,它通常包含一個emule協議中完整的包,例如有協議的頭部數據等,還內置了PackPacket和UnPackPacket方法,可以自行進行壓縮和解壓的功能。SendPacket把要發送的Packet放到自己的隊列中,這個隊列也有兩個,控制信息包隊列,和標準信息包隊列。如果有必要,把自己加入到UploadBandwidthThrottler的隊列中。 我們注意到CEMSocket的SendControlData和SendFileAndControlData方法其實都是調用自己的另一個重載的Send方法。而且我們也已經知道這個方法是在UploadBandwidthThrottler的工作線程中的大循環中被調用的,而這個Send方法的內容本身也是一個大循環,但是意義很明了,就是在不超過自己本次發送的配額的情況下,把自己的包隊列中的包取出來,并且發出去。同樣,這里也用到了一個臨界區,它是為了保證從包隊列中取出包來發送和把包往隊列中放的操作是互斥的。因此,如果把它和UploadBandwidthThrottler結合起來,我們就看到了一個兩層的隊列,即所有的套接字組成了一個發送隊列,在UploadBandwidthThrottler的控制下保證了對速度的限制,而每個套接字即將發送的數據包又組成了一個隊列,保證了每次進行數據發送的時候都會滿足UploadBandwidthThrottler的要求。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品成人久久综合一区| 亚洲色图视频网站| 国产精品久久久久久福利一牛影视| 亚洲精品国久久99热| 美腿丝袜亚洲综合| 91免费视频网址| 精品欧美一区二区在线观看| 亚洲黄一区二区三区| 国产成人在线观看| 欧美卡1卡2卡| 亚洲视频你懂的| 国产精品一品视频| 日韩欧美123| 亚洲精品成人在线| 国产v日产∨综合v精品视频| 在线成人高清不卡| 天天av天天翘天天综合网色鬼国产 | 欧美刺激脚交jootjob| 亚洲美女屁股眼交3| 成人国产精品免费观看动漫| 日韩丝袜美女视频| 一区二区高清视频在线观看| 岛国精品在线观看| 国产日韩欧美精品在线| 九九热在线视频观看这里只有精品| 色婷婷精品大视频在线蜜桃视频| 中文字幕成人av| 国产成人午夜电影网| 久久亚洲影视婷婷| 久久精品国产秦先生| 日韩视频一区二区在线观看| 亚洲成人午夜电影| 久久久影视传媒| 精品中文字幕一区二区| 日韩视频中午一区| 久久av资源站| 精品伦理精品一区| 精品在线免费观看| 久久免费看少妇高潮| 国产精品亚洲一区二区三区在线| 亚洲精品在线观看网站| 激情久久五月天| 久久久亚洲综合| 国产v综合v亚洲欧| 亚洲伦在线观看| 在线观看亚洲专区| 五月天视频一区| 欧美不卡一区二区三区四区| 久久av老司机精品网站导航| 精品国产人成亚洲区| 国产福利不卡视频| 亚洲视频免费观看| 欧美色视频在线| 青青草成人在线观看| 久久综合九色综合欧美98| 国产高清亚洲一区| 一区二区三区中文免费| 欧美日韩高清在线播放| 精品一区二区三区影院在线午夜| www国产精品av| 色婷婷综合久久久中文字幕| 亚洲第一主播视频| 久久久久久影视| 色综合咪咪久久| 五月综合激情婷婷六月色窝| 日韩精品一区二区三区中文精品 | 国产精品羞羞答答xxdd| 中文字幕亚洲在| 欧美日韩一区高清| 国产一区91精品张津瑜| 亚洲女与黑人做爰| 日韩欧美一区二区三区在线| 成人免费视频视频| 日韩av网站在线观看| 久久男人中文字幕资源站| 一本色道久久综合狠狠躁的推荐| 日韩激情一二三区| 亚洲欧美自拍偷拍色图| 精品国产麻豆免费人成网站| 91蝌蚪porny| 国产原创一区二区三区| 亚洲国产精品一区二区久久| 国产视频一区在线播放| 91麻豆精品国产无毒不卡在线观看| 国产69精品久久777的优势| 日韩电影在线免费| 国产精品超碰97尤物18| 2020国产精品自拍| 欧美一区二区三区人| 色婷婷久久99综合精品jk白丝 | 精品久久久久久久久久久久久久久久久| 国产成人亚洲精品狼色在线| 日韩电影在线免费| 亚洲成在人线免费| 亚洲欧美日韩综合aⅴ视频| 国产欧美一区二区三区在线看蜜臀| 欧美美女一区二区| 欧美主播一区二区三区| 成人av高清在线| 国产乱码精品一区二区三区忘忧草 | 欧美日韩国产中文| 91麻豆精品视频| 成人性生交大片免费看中文| 经典一区二区三区| 日韩精品一二三区| 亚洲美女偷拍久久| 自拍偷拍国产精品| 精品久久久三级丝袜| 日韩欧美激情四射| 99久久99久久综合| 成人av网址在线观看| 国产一区二区三区久久悠悠色av| 亚洲一区自拍偷拍| 亚洲成人一区在线| 亚洲综合免费观看高清完整版| 亚洲视频香蕉人妖| 国产精品夫妻自拍| 亚洲欧美乱综合| 欧美国产精品劲爆| 国产精品看片你懂得| 精品成人私密视频| 日韩欧美区一区二| 日韩一卡二卡三卡四卡| 91精品婷婷国产综合久久性色 | 亚洲男人的天堂在线观看| 欧美xxxx老人做受| 3d成人h动漫网站入口| 91麻豆精品国产91久久久更新时间| 99国产精品久久久久久久久久久| 蜜臀久久久99精品久久久久久| 3atv一区二区三区| 91丨九色丨黑人外教| 91社区在线播放| 国产大陆亚洲精品国产| 国产成人av网站| 亚洲自拍偷拍九九九| 亚洲图片欧美综合| 五月天网站亚洲| 日本午夜精品视频在线观看| 日本免费在线视频不卡一不卡二| 日本欧美一区二区三区| 免费的成人av| 久久精品国产久精国产| 国产成人av在线影院| 色婷婷久久久综合中文字幕 | 一区二区三区免费看视频| 亚欧色一区w666天堂| 人人精品人人爱| 国产99精品国产| 色婷婷综合久久久久中文一区二区| 欧美精品乱码久久久久久| 91精品国产免费| 成人免费一区二区三区视频| 亚洲人被黑人高潮完整版| 污片在线观看一区二区| 玖玖九九国产精品| 97精品久久久午夜一区二区三区 | 欧美日韩精品欧美日韩精品一综合| 99久久国产综合精品色伊| 欧美天堂一区二区三区| 欧美色图12p| 久久午夜电影网| 亚洲免费观看高清完整| 天堂蜜桃91精品| 粉嫩av亚洲一区二区图片| 91黄色免费看| 欧美成人a视频| 一区二区三区在线视频播放| 五月天丁香久久| 在线亚洲一区二区| 日韩三级中文字幕| 国产精品人妖ts系列视频| 蜜桃在线一区二区三区| 国产成人免费视频精品含羞草妖精| 欧美日本高清视频在线观看| 久久你懂得1024| 麻豆极品一区二区三区| 国产精品一区二区91| 日韩欧美123| 日韩中文字幕亚洲一区二区va在线 | 亚洲视频一二三| 欧美aⅴ一区二区三区视频| 在线精品视频免费观看| 欧美经典一区二区三区| 午夜精品久久一牛影视| 色综合久久88色综合天天6| 日韩美一区二区三区| 无吗不卡中文字幕| 91视频免费观看| 国产精品剧情在线亚洲| 国产精品性做久久久久久| 欧美高清视频不卡网| 一区二区日韩av| 成人福利视频在线| 国产精品久久一卡二卡| 黑人精品欧美一区二区蜜桃| 日韩欧美在线网站| 秋霞成人午夜伦在线观看| 91丨九色丨蝌蚪富婆spa| 亚洲美女在线一区|