首頁 > 文章中心 > 正文

          P2P文件系統

          前言:本站為你精心整理了P2P文件系統范文,希望能為你的創作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。

          摘要:系統QtP2Pfile-sharingSystem(QPS)是利用Qt開發的P2P文件共享系統。QPS采用P2P中的混合模式,此模式結合了集中目錄式和純分布式兩者的優點,在實現上具有簡易性,在共享度上具有很強的擴展性。QPS的最大特點是加入了策略。這種策略能限制一些用戶只下載而不共享資源的行為。策略的引入是為了鼓勵用戶與其他人分享自己的資源,而不僅僅是索取。入策略的QPS不僅能比較有效的限制只下載不分享的行為,而且對系統的壽命也有相當程度的提高。

          關鍵詞:文件共享;P2P;策略;Qt

          C/S式架構造就了一批著名的門戶網站,如雅虎,新浪等。這些網站容易受到黑客的親睞后果是服務崩潰。C/S式架構只有一個服務器或服務機群,服務器一旦崩潰,它提供的服務也將停止。而P2P式架構卻正好相反,它沒有服務器(相對C/S架構而言)或服務器是分布的,一個服務器崩潰了,其他的服務器照樣能提供服務。這種架構能有效的抵抗DDOS攻擊,它的安全性有很可靠的保障。另外,采用P2P式架構的網絡資源共享系統不但大大的減輕了單個服務器的負擔,而且也提高了很大的安全性。人們也可以通過這種架構建立自己的信息天地,與其他的人分享自己的資源。

          1系統設計實現的重點與難點

          系統QPS在Linux上用Qt開發,系統設計原理和策略都并不復雜,但這不代表系統的實現也是簡單的。對于系統的整個實現來說,有三個地方是最重要的,也是比較難的。先介紹系統運行流程:

          (1)Group-leaderpeer運行,并連接上其他的任意某個Group-leaderpeer;

          (2)Ordinarypeer連接(登陸)某個Group-leaderpeer,并把所資源表發送個Group-leaderpeer;

          (3)Group-leaderpeer將已連接的其他PC的資源表發送給此ordinarypeer;

          (4)Ordinarypeer瀏覽資源并選擇下載或則向Group-leaderpeer發送資源搜索請求;

          (5)Group-leaderpeer將資源表中符合搜索的資源所在ordinarypeer的IP發給請求ordinarypeer,同時向其他以連接的Group-leaderpeer發送搜索請求,其他的Group-leaderpeer將資源IP反饋,收到反饋后再發送個搜索ordinarypeer;

          (6)Ordinarypeer從獲得的資源表中選擇下載,即與另一個ordinarypeer建立連接,下載完畢后斷開連接。

          從上面的過程可以看出,系統共有三個通信鏈路,分別是:

          (1)Group-leaderpeer與Group-leaderpeer之間的通信;

          (2)ordinarypeer與Group-leaderpeer之間的通信;

          (3)ordinarypeer與ordinarypeer之間的通信。

          三個通信鏈路上的信息都是不一樣的。因此,必須給三個通信鏈路都制定相應的通信協議。QPS不是多線程的,因此對每個通信套接字來說,都必須知道對方的套接字。這在實現上也存在一定的難度,這個是由開發工具而帶來的。最后一個難度是NAT穿透問題。為了解決不同局域網間的通信,這個問題的解決是必須的。由于開發硬件環境的限制,現版本的QPS本沒有考慮這個問題。也就是說,實現的版本是局域網內的。在此,需要指出的是,NAT的問題并沒有違背QPS的目的。首先,QPS只是當前的一個版本,以后可能會進一步完善;再者,在將來IPv6的推出就自然而然的解決了不同局域網內通信這一問題。

          2實現過程

          針對上節的三個通信鏈路,必須要設計好三個通信協議。先看下QPS中需要傳輸的各種信息。如圖1:

          通信鏈路上的信息表示的意義如下:

          Downloadrequest:文件下載請求信息;

          Filedata:文件數據;

          Localsharelist:本地的共享信息列表,包括文件名,文件大小,下載次數等;

          Sharelist:Group-leaderpeer上的共享信息列表;

          Searchmessage:文件搜索信息,包括文件名及搜索跳數;

          Searchresult:返回的搜索結果,包括文件名和文件所在IP;

          Otherleadermsg:其他leaderpeer上的信息,包括連接ordinarypeer數目和文件數量等;

          Localsharemsg:和otherleadermsg一樣。

          (1)數據結構定義。

          為了實現以上三個通信協議,首先規定了一些數據結構,以區別不同的通信信息。個種數據結構如下:

          #defineFILEINFO1//文件信息

          #defineSHAREINFO2//共享列表信息

          #defineDOWNLOAD3//下載請求信息#defineSEARCH4//文件搜索信息

          #defineLEADERINFO5//Group-leaderpeer信息

          #defineFILEDATA6//文件數據

          #defineMAX_SIZE(2048*10)//文件數據的大小

          typedefstruct

          {

          inttype;//表示是何種信息,下同

          ULONGsize;//文件大小

          ULONGdownloadTimes;//文件下載次數

          charname[100];//文件名

          }FileMsg;//文件信息結構體

          typedefstruct

          {

          inttype;

          ULONGsize;//文件大小

          ULONGdownloadTimes;//文件下載次數

          charip[20];//文件所在IP

          charname[100];//文件名

          }ShareMsg;//共享信息列表結構體

          typedefstruct

          {

          inttype;

          ULONGsize;//文件大小

          ULONGseek;//文件數據塊在文件中的位置

          charname[100];//文件名

          }DownloadMsg;//下載請求結構體

          typedefstruct

          {

          inttype;

          ULONGtips;//文件搜索跳數

          charname[100];//文件名

          }SearchMsg;//文件搜索結構體

          typedefstruct

          {

          inttype;

          ULONGconnectedNumber;//連接數量

          ULONGfileNumber;//文件數目

          charip[20];//Group-leaderpeer的IP

          }LeaderMsg;//Group-leaderpeer信息結構體

          typedefstruct

          {

          inttype;

          ULONGseek;//文件數據塊在文件中的位置

          ULONGbytes;//buff中的實際字節數

          ULONGsize;//文件大小

          charname[100];//文件名

          charbuff[MAX_SIZE];//文件數據

          }FileData;//文件數據結構體

          (2)信息傳輸函數的聲明。

          voiduploadShareList(constFileMsg&file);//uploadlocalsharelisttoleader

          voiddownload(constDownloadMsg&msg);//downloadfiledata

          voidsearch(QStringfileName,UINTtips);//searchafile

          voiddownShareList();//downloadotherpeers''''sharelistfromleader

          voidotherLeadersInfo();//getotherleaders''''infothroughtheconnectedleader

          voidsearchBack();//seachresultback,readit

          voiduploadFile(intsock);//uploadthefiledatathatdownloaderrequested

          voidreceiveList(intsock);//receivepeer''''ssharelist

          voidsendShareList(ComSocket*socket);//sendsharelisttopeer->socket

          voidsendOtherLeaderInfo(ComSocket*socket);//sendotherleaders''''infotopeer

          voidsendLeaderInfo(ComSocket*socket);//sendleader''''sinfotosomeleader

          voidsearch(intsock);//receivedsearchrequestfrompeer

          voidremoteSearch(SearchMsgmsg);//sendsearchtologonedleader

          voidleaderSearch(intsock);//receivedleader''''ssearchrequest

          voidsearchBack();//receivedsearchresultfromleader

          以上函數是根據上面的數據結構而聲明的。每個函數都有一個對應的數據結構。這些函數是整個系統的核心。

          設計了解決通信問題的數據結構和函數的聲明后,剩下需要做的便是具體編碼,將聲明的函數加以實現,最后測試其是否正確便真正意義上的解決了上面敘述的難點問題,也是核心問題。

          (3)用戶接口。

          QPS只給用戶提供了簡單的操作接口,但我相信這是足夠的。具體的用戶接口如下:

          連接選擇:讓用戶選擇想要連接的Group-leaderpeer。

          上傳數目設置:為了限制上傳量,保障用戶的系統資源(CPU,網絡帶寬等)。

          搜索設置:讓用戶輸入文件名及搜索跳數。

          下載選擇:雙擊文件名即可下載該文件。共享目錄設置:讓用戶選擇想要共享的目錄

          下載目錄設置:讓用戶選擇下載文件放置的路徑

          除了上述用戶可以直接操作的接口外,還有些接口是用戶不可操作的。這些接口是用來顯示當前系統的運行情況。比如,下載顯示用來顯示當前正在下載的文件,包括下載速率,已下載文件的大小等;而下載完成列表顯示的則是系統自啟動以來下載的所有文件列表。對于許多的其他文件共享系統來說,它們都有豐富的接口,盡可能的讓用戶使用更簡便。QPS的設計和實現的主要目的是在原理和策略上挖掘網絡資源,使得網絡資源能夠盡可能的廣泛共享。因此,在界面上只做了基本的接口。

          (4)配置文件。

          為方便用戶的各項設置,QPS中也有許多的配置文件。這些配置文件在系統運行時會被自動的讀取,相應的變量會被賦值。用戶改變某個設置后,這項設置同樣會被寫入到配置文件中,并在下次運行時被讀取。這類配置文件典型的是下載目錄和共享目錄的設置。系統運行時,會找到當前共享目錄路徑,并獲取該目錄下文件信息。還有一類配置文件是可作為用戶輸入的文本文件。比如leaders.dat這個文件就是用來讓用戶輸入可以選擇連接的Group-leaderpeerIP的。記錄文件被下載次數的配置文件對用戶來說是不可更改的,這是為了防止用戶惡意修改此文件以獲得totalValue,達到少共享文件就可以下載大量文件的目的。

          文件共享系統QPS是在上面敘述的四點上一步一步加以實現的,其中也有考慮不全的地方,反反復復經過了幾次修改。在提供基本功能上,工作重點都放在協議的實現上。由于Qt開發平臺沒有對網絡程序提供豐富的接口,許多的接口不得不自己一步一步實現并測試正確性。在這點上,對QPS的實現確實用相當大的影響。當然,這帶來的好處是二次開發比較簡便,因為上層的接口都是已經實現了的,正確性很高。

          參考文獻

          [1]陸正中,馬進德,石正貴等.JBuilder9軟件開發項目實踐[M].北京:清華大學出版社,2005:240-261.[2]JamesF.Kurose,KeithW.Ross。計算機網絡——自頂向下方法與Internet特色[M].北京:高等教育出版社,2005:136-145.

          [3]RobertFlenner等,JavaP2P技術內幕[M].北京:電子工業出版社,2003:200-235.

          [4]許斌.JXTA——JavaP2P網絡編程技術[M].北京:清華大學出版社,2003:1-256.

          [5]Oaks,Traversat,Gong.JXTA技術手冊[M].北京:清華大學出版社,2004:23-78.

          文檔上傳者