freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一種p2p內(nèi)容下載緩存系統(tǒng)設(shè)計和下載軟件開發(fā)-資料下載頁

2025-07-28 10:10本頁面
  

【正文】 t(sockfd)開始(main)Listen客戶端請求內(nèi)容的連接accept 客戶端的P2P內(nèi)容請求使用fork()函數(shù)創(chuàng)建一子進程等待客戶端發(fā)送主動握手信息向Client發(fā)送被動握手信息收到Client主動握手信息向Client發(fā)送bitfield信息子進程父進程建立新socket 與客戶端通信解析握手信息,得到Info_hash收到Client的interest信息向Client發(fā)送unchock信息解析Client發(fā)來的request信息根據(jù)request信息返回piece信息傳遞內(nèi)容完整嗎?結(jié)束子進程,釋放資源圖44 P2P內(nèi)容服務(wù)程序流程圖 數(shù)據(jù)結(jié)構(gòu)與關(guān)鍵算法分析 socketint socket ( /*返回一個整形的socket描述符 */ int family, /*指明所使用的協(xié)議簇 */ int type, /*socket的類型,UDP或是TCP */ int protocol /*指明使用協(xié)議名 */)。178。 P2P種子下載進程sockfd: 監(jiān)聽從路由器轉(zhuǎn)發(fā)來客戶端的數(shù)據(jù)報的socket描述符;clientfd: 與客戶端進行通信所使用的socket描述符;seeddwnfd: 從種子服務(wù)器下載種子的socket描述符;contentdwnfd: 從內(nèi)容服務(wù)器上下載內(nèi)容文件的socket描述符;178。 P2P內(nèi)容服務(wù)進程sockfd: 監(jiān)聽從客戶端發(fā)送的連接請求的socket描述符;dwnsockfd: 接受客戶端連接,并提供下載服務(wù)的socket描述符; sockaddrstruct sockaddr_in {   short int sin_family。 /* 地址族 */   unsigned short int sin_port。 /* 端口號 */   struct in_addr sin_addr。 /* IP地址 */   unsigned char sin_zero[8]。 /* 填充0 以保持與struct sockaddr同樣大小 */   }。178。 P2P種子下載進程server_addr:: 服務(wù)器監(jiān)聽客戶端發(fā)來數(shù)據(jù)報的sockaddr。router_addr: 路由器將P2P數(shù)據(jù)報轉(zhuǎn)發(fā)給P2P緩存服務(wù)器的sockaddr;getclient_addr: 請求種子的客戶端的sockaddr;seedserver_addr: 種子服務(wù)器的sockaddr;contentserver_addr: 內(nèi)容服務(wù)器的sockaddr;178。 P2P內(nèi)容服務(wù)進程server_addr: 用于向客戶端提供內(nèi)容上傳服務(wù)的服務(wù)器的sockaddr;client_addr: 客戶端向內(nèi)容服務(wù)器進行連接請求的sockaddr; 所使用的端口178。 P2P種子下載進程listenport: 3333 監(jiān)聽客戶端連接的端口;get_dest_port: 8080 HTTP服務(wù)器監(jiān)聽的服務(wù)器端口;content_svr_port:5555 內(nèi)容服務(wù)器監(jiān)聽的服務(wù)端口;178。 P2P內(nèi)容服務(wù)進程serverport: 68816889 服務(wù)器監(jiān)聽客戶端發(fā)送連接請求的端口; peer之間的握手信息格式(BitTorrent protocol協(xié)議[12])pstrlenpstrreservedinfo_hashpeer_id1) pstrlen:pstr的長度,是單一的原始字節(jié)(通常為19)。2) pstr:協(xié)議的字符串標志(通常為BitTorrent protocol)。3) reserved:8字節(jié)保留字。4) info_hash:元信息文件中的鍵info的20字節(jié)SHA1哈希值。5) peer_id:客戶端使用的唯一性ID,20字節(jié)字符串。 消息流message的格式[13]長度前綴消息 ID負載。長度前綴是一個4字節(jié)的大尾端值,消息ID是一個10進制字符,負載視消息類型而定。a) keepalive:len=0000 keepalive消息長度固定,消息長度后面沒有任何數(shù)據(jù)。peer在一段時間內(nèi)都接收不到消息的話,可能會關(guān)閉連接,所以可以發(fā)送keepalive消息維持連接。該消息通常每兩分鐘發(fā)送一次;b) chock:len=0001id=0 chock消息長度固定,且沒有負載;c) unchock:len=0001id=1 unchock消息長度固定,且沒有負載;d) interested:len=0001id=2 interested消息長度固定,且沒有負載;e) not interested:len=0001id=3 not interested消息長度固定,且沒有負載;f) have:len=0005id=4piece index have消息長度固定,負載是一個片的索引,該索引從零開始,是成功下載并且通過哈希驗證的;g) bitfield:len=0001+Xid=5bitfield bitfield消息可能只在握手系列完成后立刻發(fā)送,在這之前沒有其他任何消息發(fā)送。它是可選的,而且如果客戶端不擁有任何片則不需要發(fā)送。bitfield消息是變長的,X指bitfield的長度。負載是一個比特組表示已經(jīng)成功下載的片,第一個字節(jié)的高比特位表示索引為0的片,置0的比特位表示缺失的片,置1則表示有效的可提供的片。最后剩余的比特位置0。長度不正確的bitfield應(yīng)視為出錯。如果長度不正確,或剩余比特位有任何位置1,客戶端都應(yīng)該丟棄連接;h) request:len=0013id=6indexbeginlength request消息長度固定,用于請求一個塊。index:4字節(jié)整數(shù),指明片的索引號。begin:4字節(jié)整數(shù),指明片內(nèi)的字節(jié)偏移量。length:4字節(jié)整數(shù),指明要求的長度;i) piece:len=0009+Xid=7indexbeginblock piece消息變長,X指block的長度。index:4字節(jié)整數(shù),指明片的索引號。begin:4字節(jié)整數(shù),指明片內(nèi)的字節(jié)偏移量。block:塊數(shù)據(jù),是指定索引的片的子集;j) cancel:len=0013id=8indexbeginlength cancel消息固長,負載和request消息的一樣。一般用于“End Game”階段,用于取消請求request;k) port:len=0003id=9listenport port消息由實現(xiàn)了DHT Tracker的新版本客戶端軟件發(fā)出。監(jiān)聽端口是該peer的DHT節(jié)點的監(jiān)聽端口,該peer應(yīng)被插入到當?shù)芈酚杀砩希ㄈ绻鸇HT Tracker支持的話);說明:在連接開始時,Peer之間的狀態(tài)為是“阻塞”和“無興趣”狀態(tài),即:216。 am_choking = 1  (am_choking:該客戶端阻塞了此peer)216。 am_interested = 0  (am_interested:該客戶端對此peer感興趣)216。 peer_choking = 1  (此peer阻塞了該客戶端)216。 peer_interested = 0 (此peer對該客戶端感興趣) peer結(jié)構(gòu)體P2P緩存服務(wù)器向client返回的peer(結(jié)構(gòu)體)列表(列表中包含N個peer信息),列表中包含4個字節(jié)的IP地址,2個字節(jié)的Port端口號。struct peer { struct in_addr sin_addr。 /* IP地址 */ unsigned short int sin_port。 /* 端口號 */ }。 HTTP GET請求格式每個HTTP請求都包含兩個部分:1) HTTP請求行,為GET;2) HTTP請求中的可選消息頭,這些消息頭會由于使用的HTTP客戶端瀏覽器或客戶端瀏覽器配置選項的不同而不同。a) HTTP請求:請求的方法是GET,“/”表示請求Web服務(wù)器的根目錄,“HTTP/”表示的是URI(Uniform Resource Identifier,統(tǒng)一資源標識符)及其版本;b) Accept:指定客戶端能夠接收的內(nèi)容類型,內(nèi)容類型中的先后次序表示客戶端接收的先后次序。這里可以看到客戶端能夠接收的類型有g(shù)if、bitmap、jpeg等等。c) AcceptLanguage:指定優(yōu)先選擇的語言;d) AcceptEncoding:指定內(nèi)容編碼類型;e) UserAgent:包含HTTP客戶端運行的瀏覽器類型;f) Host:包含的主機信息;g) Connection:指定的連接類型。 數(shù)據(jù)定義178。 P2P種子下載進程LISTENPORT 3333 P2P種子下載進程監(jiān)聽端口;LISTENNUM 1000 P2P種子下載進程監(jiān)聽連接的最大數(shù);MAXDATA 1512 HTTP GET請求內(nèi)容的最大字節(jié)數(shù);MAXMSG 5109 客戶端與服務(wù)器之間進行交換信息的最大字節(jié)數(shù),也即是支持最大 每片為4M字節(jié)的文件下載;MAXSEED 1024*1024 種子文件的最大字節(jié)數(shù),可支持1M以內(nèi)在種子文件;MAXPIECE 8*100*1024 內(nèi)容文件生成種子時允許最大的分片數(shù),假設(shè)每片大小為128KB, 那么該系統(tǒng)支持100G以上的文件下載; 178。 P2P內(nèi)容服務(wù)進程LISTENNUM 1000 P2P內(nèi)容服務(wù)進程監(jiān)聽連接的最大數(shù);MAXREAD 4096 從文件中讀取到緩沖區(qū)read_buf中數(shù)據(jù)的最大字節(jié)數(shù),也是每片 的最大數(shù);MAXMSG 5109 客戶端與服務(wù)器之間進行交換信息的最大字節(jié)數(shù),也即是支持最大 每片為4M字節(jié)的文件下載;SERVERPORT 68816889 P2P內(nèi)容服務(wù)進程監(jiān)聽端口; 系統(tǒng)軟件測試 系統(tǒng)測試環(huán)境由于本系統(tǒng)是面向ISP開發(fā)和使用的,但是由于條件限制,不能再真實的ISP出口處進行測試,因此選擇在局域網(wǎng)內(nèi)測試。本次測試的四臺計算機處于同一個局域網(wǎng),,,。系統(tǒng)配置表見41,網(wǎng)絡(luò)拓撲結(jié)構(gòu)[14]見圖45。圖45 系統(tǒng)測試拓撲結(jié)構(gòu)圖表41 系統(tǒng)測試配置表用戶系統(tǒng)配置用戶AWindowsXP+Linux系統(tǒng)虛擬機,虛擬機網(wǎng)絡(luò)使用橋接方式 IP地址:用戶BWindowsXP+Linux系統(tǒng)虛擬機,虛擬機網(wǎng)絡(luò)使用橋接方式 IP地址:用戶CWindowsXP+Linux系統(tǒng)虛擬機,虛擬機網(wǎng)絡(luò)使用橋接方式 IP地址:用戶DWindowsXP+Linux系統(tǒng)虛擬機,虛擬機網(wǎng)絡(luò)使用橋接方式 IP地址:由于測試環(huán)境的限制,用戶A作為ISP下P2P內(nèi)容緩存服務(wù)器,用戶B種子服務(wù)器和原始內(nèi)容文件服務(wù)器,用戶C和用戶D作為ISP下普通的網(wǎng)絡(luò)接入用戶,用于請求P2P文件下載。 系統(tǒng)測試時遇到的問題 socket通信中bind問題在使用socket通信中,bind()是一個很重要的函數(shù),一般在服務(wù)器端程序中使用。該函數(shù)是用于將本地IP地址綁定端口號的,綁定成功返回0,不成功返回1。另外,它主要用于TCP連接,而在UDP連接中則無此必要。在P2P種子下載程序調(diào)試運行過程中,顯示bind不成功,經(jīng)過分析,問題原因只有兩種:IP地址設(shè)置不對,不是本地IP地址;端口設(shè)置不正確。經(jīng)查找,發(fā)現(xiàn)IP地址設(shè)置為INADDR_ANY(即為本地IP地址),端口選擇8080端口,而8080端口被WWW服務(wù)占用,所以綁定出錯,改成3333后綁定成功。 進程關(guān)閉問題在軟件測試過程中,發(fā)現(xiàn)程序在響應(yīng)用戶請求結(jié)束后,沒有關(guān)閉子進程,子進程仍然運行。經(jīng)查閱資料發(fā)現(xiàn),Linux系統(tǒng)下提供了兩個用于關(guān)閉進程的函數(shù)[9]exit()和_exit(),當程序執(zhí)行到exit和_exit時,進程會無條件地停止剩下所有的操作,清楚包括PCB在內(nèi)的各種數(shù)據(jù)結(jié)構(gòu),并終止本進程的運行。但是exit()和_exit()還是有區(qū)別的。最大的區(qū)別就在于exit()函數(shù)在調(diào)用exit系統(tǒng)之前要檢查文件打開情況,把文件緩沖區(qū)中的內(nèi)容寫回文件,而_exit()則不執(zhí)行此操作。最后,在程序最后添加了exit(0)(函數(shù)參數(shù)0指正常結(jié)束),程序運行正常,運行完畢后自動關(guān)閉子進程,釋放資源。 文件I/O操作過程本系統(tǒng)中使用的文件I/O操作均是不帶緩存在I/O操作,主要涉及到5個函數(shù)[9],open、read、write、lseek、close。當需要寫文件時,則執(zhí)行open、(lseek)、write、close;當需要讀文件時則執(zhí)行open、(lseek)、read、close。其中每個函數(shù)都有規(guī)定好的參數(shù),代入不同的參數(shù),得到不同的結(jié)果。在程序執(zhí)行時,在進行文件讀操作中,已存在文件內(nèi)容被清空,文件大小變?yōu)? 。經(jīng)仔細檢查,發(fā)現(xiàn)在打開文件時,open函數(shù)代入了一個參數(shù)O_TRUNC,這個參數(shù)的代表:當打開文件存在時,并且以只讀或只寫方式成功打開時,首先全部刪除文件原有數(shù)據(jù),再對文件進行操作,因此才會發(fā)現(xiàn)原文件大小變?yōu)?。當刪除此參數(shù)后,運行程序,工作正常。 文件寫操作時,追加與覆蓋的區(qū)別當使用P2P方式下載文件時,由于文件采取分片傳輸?shù)姆绞?,因此要多次將受到的?shù)據(jù)寫入到文件中,文件傳送方式是順序的,在打開文件時,就將文件打開發(fā)式設(shè)置為追加方式,在用戶正常下載文件時運行很正常。但是在用戶第二次請求下載該文件時,問題就出現(xiàn)了:新下載的數(shù)據(jù)會自動追加到原文件后面,而不會覆蓋該文件。為了解決問題,將文件打開方式中的追加方式去掉,在將接受到數(shù)據(jù)寫入到文件之前,利用lseek函數(shù)將移動文件指針,將指針移到存放該數(shù)據(jù)的首地址。經(jīng)過編譯,運行
點擊復制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1