計(jì)算機(jī)網(wǎng)絡(luò)socket實(shí)驗(yàn)_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)socket實(shí)驗(yàn)_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)socket實(shí)驗(yàn)_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)socket實(shí)驗(yàn)_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)socket實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

計(jì)算機(jī)科學(xué)與技術(shù)《計(jì)算機(jī)網(wǎng)絡(luò)》實(shí)驗(yàn)報(bào)告socket編程學(xué)院姓名學(xué)號(hào)(后邊附有源代碼地址)年月日Phase1:EstablishingClient-ServerCommunications題目要求此題目要求實(shí)現(xiàn)一個(gè)通過TCP套接字來建立連接的通訊,服務(wù)器和客戶端需要實(shí)現(xiàn)以下5個(gè)功能:客戶端與服務(wù)器建立連接,需要用戶名和加密密碼??蛻舳税l(fā)送想分享的文件名給服務(wù)器。客戶端發(fā)送一個(gè)想下載的文件查詢??蛻舳孙@示收到的回復(fù)信息,并顯示。登出。開發(fā)環(huán)境操作系統(tǒng):Linux2.6.32-279.el6.x86_64編程語言:C99編譯器:GCC4.4.620120305(RedHat4.4.6-4)程序詳解網(wǎng)絡(luò)和I/O使用單線程利用epoll實(shí)現(xiàn)非阻塞異步IO。此部分功能主要用于實(shí)現(xiàn)多客戶端的網(wǎng)絡(luò)I/O的輪詢處理,使用Linux內(nèi)核中的EPOLL特性實(shí)現(xiàn)。維護(hù)一個(gè)哈希表(Client),用于將文件描述符與客戶端數(shù)據(jù)(如接收緩沖區(qū)、發(fā)送緩沖區(qū)和會(huì)話狀態(tài)等)進(jìn)行映射。對(duì)應(yīng)主要的功能函數(shù)包括:intnewclientid(intfd)用于在Client哈希表中創(chuàng)建新項(xiàng),與提供的文件描述符(fd)對(duì)應(yīng)。intfd2clientid(intfd)用于在Client哈希表中根據(jù)提供的文件描述符(fd)查找項(xiàng)目。voidsetnonblocking(intsock)設(shè)置SOCKET為非阻塞模式intserver_startup(u_shortport)在指定的端口上啟動(dòng)trackerd監(jiān)聽服務(wù),并設(shè)置epollintpush_data(structclient_data*client,char*buf,intlen)向指定的客戶端推送數(shù)據(jù),會(huì)先進(jìn)入客戶端數(shù)據(jù)體內(nèi)的發(fā)送緩沖區(qū),再等待由epoll通知就緒時(shí)發(fā)送voidclose_client(intclientid)關(guān)閉指定的客戶端,釋放資源intserver_loop()網(wǎng)絡(luò)服務(wù)循環(huán),調(diào)用epoll來接受連接和就緒通知,并監(jiān)視連接中斷,如有數(shù)據(jù)就緒則使用recv放入接收緩沖區(qū),如通知發(fā)送就緒則將用send將發(fā)送緩沖區(qū)中的數(shù)據(jù)發(fā)送至客戶端。對(duì)于新客戶端連接,調(diào)用accept。以上操作都是非阻塞的。數(shù)據(jù)包處理inthandle_packet(structclient_data*client)立即處理接收緩沖區(qū)中的完整數(shù)據(jù)包(即以”\n”結(jié)尾的消息),將處理完成的部分從緩沖區(qū)中移除intpush_packet(structclient_data*client,charconst*fmt,...)按指定的格式化方式向客戶端發(fā)送數(shù)據(jù)包,是push_data的上層封裝inthandle_share(structclient_data*client,char*command,intlen)處理SHRE消息inthandle_search(structclient_data*client,char*command,intlen)處理SRCH消息inthandle_quit(structclient_data*client,char*command,intlen)處理QUIT消息inthandle_login(structclient_data*client,char*command,intlen)處理LGIN消息inthandle_command(structclient_data*client,char*command,intlen)核心消息分發(fā)函數(shù),將根據(jù)消息前4字節(jié)判斷消息類型,并調(diào)用相應(yīng)處理函數(shù)進(jìn)行實(shí)際處理用戶模塊intuser_check(char*username,char*password)驗(yàn)證指定的用戶名密碼,正確返回0,否則返回-1intuser_load(char*htpasswd)從指定的文件載入用戶名和密碼,每行一個(gè),格式如user:pwd文件列表模塊intshare_add(char*ipaddr,char*port,char*name,char*owner)添加新的文件分享structfile_share*share_get_head()獲取第一個(gè)文件分享(這是一個(gè)鏈表,獲取鏈表中的表頭)intshare_remove_by_owner(char*owner)刪除由特定用戶發(fā)布的文件分享(用來在用戶斷開連接或QUIT時(shí)清理)程序流程圖圖1服務(wù)器圖2 客戶端5程序源代碼 詳見“源碼”文件夾中的“phase1”文件夾項(xiàng)目。Phase2:EstablishingPeer-PeerCommunications題目要求在Phase1的基礎(chǔ)上,為客戶端增加“PING發(fā)送/響應(yīng)”和“文件請(qǐng)求/傳輸”功能。PING發(fā)送/響應(yīng):通過UDP協(xié)議發(fā)送數(shù)據(jù)包到PEER,PEER在收到后立即回復(fù),以此測定RTT。文件請(qǐng)求/傳輸:PEER將作為服務(wù)器提供文件分享功能,接受來自其它PEER的連接,處理LGIN和GETF請(qǐng)求,將文件傳輸給其它PEER。開發(fā)環(huán)境操作系統(tǒng):Linux2.6.32-279.el6.x86_64編程語言:C99編譯器:GCC4.4.620120305(RedHat4.4.6-4)程序詳解PING接收模塊(pingd)用來提供職守服務(wù),接受PING數(shù)據(jù)包并立即響應(yīng)功能函數(shù)包括:intpingd_startup(u_shortport)在指定UDP端口上啟用PING職守服務(wù),使用EPOLL輪詢接受數(shù)據(jù)包,目前將使用與filed相同的端口號(hào)提供服務(wù)(TCP與UDP可使用相同的端口號(hào))intpingd_loop()PING服務(wù)循環(huán),調(diào)用epoll來接收數(shù)據(jù)包通知,如有數(shù)據(jù)則立即發(fā)送響應(yīng)PING發(fā)送模塊(ping)用來發(fā)送PING數(shù)據(jù)包,并獲取RTT時(shí)間功能函數(shù)包括:intping(char*ipaddr,u_shortport)向指定的IP地址和端口發(fā)送PING數(shù)據(jù)包,在時(shí)限內(nèi)等待返回,并返回RTT時(shí)間(毫秒)文件服務(wù)器(filed)與trackerd架構(gòu)相似,提供一對(duì)多的P2P文件傳輸TCP服務(wù)器。使用單線程利用epoll實(shí)現(xiàn)非阻塞異步IO。功能函數(shù)包括:intnewpeerid(intfd)用于在Peer哈希表中創(chuàng)建新項(xiàng),與提供的文件描述符(fd)對(duì)應(yīng)。intfd2peerid(intfd)用于在Peer哈希表中根據(jù)提供的文件描述符(fd)查找項(xiàng)目。voidsetnonblocking(intsock)設(shè)置SOCKET為非阻塞模式intfiled_startup(u_shortport)在指定的端口上啟動(dòng)filed監(jiān)聽服務(wù),并設(shè)置epoll。目前傳入的參數(shù)為0,因此filed將隨機(jī)監(jiān)聽一個(gè)端口作為服務(wù)(如果固定的話可能出現(xiàn)地址被占用)intfiled_push_data(structclient_data*client,char*buf,intlen)向指定的Peer推送數(shù)據(jù),會(huì)先進(jìn)入客戶端數(shù)據(jù)體內(nèi)的發(fā)送緩沖區(qū),再等待由epoll通知就緒時(shí)發(fā)送voidclose_peer(intclientid)關(guān)閉指定的Peer連接,釋放資源intfiled_loop()網(wǎng)絡(luò)服務(wù)循環(huán),調(diào)用epoll來接受連接和就緒通知,并監(jiān)視連接中斷,如有數(shù)據(jù)就緒則放入接收緩沖區(qū),如通知發(fā)送就緒則將發(fā)送緩沖區(qū)中的數(shù)據(jù)發(fā)送至客戶端,與trackerd不同的是,這里要處理文件發(fā)送過程,使用內(nèi)核特性提供的sendfile()函數(shù)實(shí)現(xiàn)零拷貝發(fā)送,邏輯上即從文件讀取一部分并發(fā)送,然后等待下次發(fā)送就緒時(shí)再發(fā)送下一部分,直到EOF時(shí),發(fā)送preamble\n并恢復(fù)文件發(fā)送標(biāo)志u_shortfiled_get_port()獲取filed目前監(jiān)聽的端口號(hào)intfiled_add_share(char*filename)添加新的文件分享,以便在其它PEER請(qǐng)求時(shí)驗(yàn)證合法性char*filed_get_share_path(char*filename)獲取文件分享時(shí),文件名對(duì)應(yīng)的完整路徑。如果沒有經(jīng)過add則返回NULL文件請(qǐng)求模塊(file)用來連接filed實(shí)現(xiàn)文件傳輸和保存功能函數(shù)包括:intfile_recv()文件請(qǐng)求過程,負(fù)責(zé)發(fā)送LGIN,等待LRES,發(fā)送GETF,解析FILE指令,打開并寫入文件,關(guān)閉連接intfile_fetch(structfile_item*item)初始化文件請(qǐng)求,負(fù)責(zé)建立和關(guān)閉到filed的連接后臺(tái)服務(wù)(background)執(zhí)行在子線程中,負(fù)責(zé)處理服務(wù)循環(huán)功能函數(shù)包括:i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論