《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)實(shí)踐》課程設(shè)計(jì)報(bào)告-多線程網(wǎng)絡(luò)文件傳輸_第1頁
《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)實(shí)踐》課程設(shè)計(jì)報(bào)告-多線程網(wǎng)絡(luò)文件傳輸_第2頁
《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)實(shí)踐》課程設(shè)計(jì)報(bào)告-多線程網(wǎng)絡(luò)文件傳輸_第3頁
《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)實(shí)踐》課程設(shè)計(jì)報(bào)告-多線程網(wǎng)絡(luò)文件傳輸_第4頁
《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)實(shí)踐》課程設(shè)計(jì)報(bào)告-多線程網(wǎng)絡(luò)文件傳輸_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

30/30《計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)實(shí)踐》報(bào)告設(shè)計(jì)題目設(shè)計(jì)題目:多線程網(wǎng)絡(luò)文件傳輸學(xué)生姓名:學(xué)號(hào):專業(yè)班級(jí):計(jì)算機(jī)科學(xué)與技術(shù)20XX年1月設(shè)計(jì)要求實(shí)現(xiàn)單線程文件傳輸實(shí)現(xiàn)多線程文件傳輸增加異??刂疲鰪?qiáng)程序的魯棒性了解使用winsocket編程了解文件傳輸過程開發(fā)環(huán)境與工具工具Visualstudio20XXQT5C++系統(tǒng)win8.18g內(nèi)存cpui73632qm設(shè)計(jì)原理利用QT設(shè)計(jì)簡(jiǎn)單的圖形界面利用winsocket編程TCP方式實(shí)現(xiàn)網(wǎng)絡(luò)通信(阻塞方式)利用windows線程函數(shù)和臨界區(qū)實(shí)現(xiàn)多線程控制四、系統(tǒng)功能描述及軟件模塊劃分客戶端:有簡(jiǎn)單的GUI,可以選擇存儲(chǔ)路徑,服務(wù)端IP,通信端口PORT,多線程或單線程,向服務(wù)端發(fā)起下載請(qǐng)求,并開始下載服務(wù)端:有簡(jiǎn)單的GUI,可以選擇顯示文件路徑,選擇通信端口PORT,選擇多線程或單線程,一旦開啟,進(jìn)入阻塞狀態(tài),知道客戶端連入,開始傳輸文件五、設(shè)計(jì)步驟//客戶端單線程接收函數(shù)voidClient::getready(){ WORDsocketVersion=MAKEWORD(2,0); if(WSAStartup(socketVersion,&wsaData)!=0) { QMessageBox::warning(this,tr("Warning"), tr("Initsocketdllerror!"),QMessageBox::Yes); exit(1); } //創(chuàng)建socket SOCKETc_Socket=socket(AF_INET,SOCK_STREAM,0); if(SOCKET_ERROR==c_Socket) { QMessageBox::warning(this,tr("Warning"), tr("CreateSocketError!"),QMessageBox::Yes); exit(1); } //指定服務(wù)端的地址 sockaddr_inserver_addr; boolok; u_shortus_port=port.toUShort(&ok,10); char*cip; QByteArrayQBA=ip.toLatin1(); cip=QBA.data(); server_addr.sin_family=AF_INET; server_addr.sin_addr.S_un.S_addr=inet_addr(cip); server_addr.sin_port=htons(us_port); if(SOCKET_ERROR==::connect(c_Socket,(SOCKADDR*)&server_addr,sizeof(server_addr))) { QMessageBox::warning(this,tr("Warning"), tr("CanNotConnectToServerIP!"),QMessageBox::Yes); exit(1); } charbuffer[BUFFER_SIZE]; memset(buffer,0,BUFFER_SIZE); char*cpath; QByteArrayQBAp=path.toLatin1(); cpath=QBAp.data(); FILE*fp=fopen(cpath,"wb");//windows下是"wb",表示打開一個(gè)只寫的二進(jìn)制文件 if(NULL==fp) { QMessageBox::warning(this,tr("Warning"), tr("FileCanNotOpenToWrite"),QMessageBox::Yes); exit(1); } else { memset(buffer,0,BUFFER_SIZE);//初始化緩沖區(qū) intlength=0;//開始接收文件 while((length=recv(c_Socket,buffer,BUFFER_SIZE,0))>0) { if(fwrite(buffer,sizeof(char),length,fp)<length) { QMessageBox::warning(this,tr("Warning"), tr("FileWriteFailed!"),QMessageBox::Yes); break; } memset(buffer,0,BUFFER_SIZE); } lalbelMSS->setText("Transformpleted"); } fclose(fp); closesocket(c_Socket); lalbelMSS->setText("Transformpleted"); //釋放winsock庫 WSACleanup();}//server端線程函數(shù)1,主要用于多線程傳輸時(shí)分塊發(fā)送文件DWORDWINAPIServer::GetFileProc1(LPVOIDlparam){ Server*p=(Server*)lparam; sockaddr_inserver_addr1;//設(shè)置默認(rèn)地址信息并初始化socket server_addr1.sin_family=AF_INET; server_addr1.sin_addr.s_addr=INADDR_ANY; server_addr1.sin_port=htons(5679); SOCKETm1_Socket=socket(AF_INET,SOCK_STREAM,0); sockaddr_inclient_addr1; bind(m1_Socket,(sockaddr*)&server_addr1,sizeof(server_addr1)); listen(m1_Socket,5); intclient_addr_len1=sizeof(client_addr1); SOCKETm1_New_Socket=accept(m1_Socket,(sockaddr*)&client_addr1,&client_addr_len1);//此處阻塞 charbuffer1[BUFFER_SIZE]; memset(buffer1,0,BUFFER_SIZE); EnterCriticalSection(&cs);//設(shè)置臨界區(qū) char*cpath; QByteArrayQBAp=p->path.toLatin1(); cpath=QBAp.data(); intFileLen_t=p->FileLen;//獲得主線程通信時(shí)獲得的文件長(zhǎng)度 intSeek=0; FILE*fp=fopen(cpath,"rb");//windows下是"rb",表示打開一個(gè)只du的二進(jìn)制文件 LeaveCriticalSection(&cs); if(NULL==fp) { exit(1); } else { memset(buffer1,0,BUFFER_SIZE); intlength=0; while(FileLen_t>0){ EnterCriticalSection(&cs); int length=fread(buffer1,sizeof(char),BUFFER_SIZE,fp); LeaveCriticalSection(&cs); if(FileLen_t>length) { send(m1_New_Socket,buffer1,length,0); } else { send(m1_New_Socket,buffer1,FileLen_t,0); } Sleep(100); memset(buffer1,0,BUFFER_SIZE); FileLen_t=FileLen_t-length; } } closesocket(m1_New_Socket); closesocket(m1_Socket); fclose(fp); }六、關(guān)鍵問題及其解決方法多線程傳輸文件時(shí),不可以多個(gè)socket使用一個(gè)端口來發(fā)送,否則會(huì)出現(xiàn)錯(cuò)誤,需要每個(gè)線程都創(chuàng)建自己的socket連接來保證文件的順序。Windows創(chuàng)建線程函數(shù)Createthread中的線程函數(shù)在類中(使用QT寫界面,主類是一個(gè)繼承了QT的類)要聲明為靜態(tài)函數(shù),要獲得類中的變量,需要傳遞類指針,并用Server*p=(Server*)lparam;重新作為類指針。使用臨界區(qū)來保護(hù)共享變量,防止各線程同時(shí)訪問寫入時(shí)出錯(cuò)。利用fseek定位各線程數(shù)據(jù)塊在文件中的位置。七、設(shè)計(jì)結(jié)果 用TCP協(xié)議的文件傳輸系統(tǒng),有簡(jiǎn)單的圖形界面,可以選擇文件和存貯文件路徑,在傳輸文件時(shí)可以選擇多線程還是單線程傳輸,如果傳輸過程出錯(cuò),可以跟據(jù)出錯(cuò)的步驟,彈出不同的提示對(duì)話框,但由于文件傳輸時(shí)基于阻塞方式的,如果服務(wù)端開啟后沒有客戶端連接會(huì)陷入阻塞。思考題:我編寫的程序是基于阻塞的,缺點(diǎn)是若客戶端沒有被連接則會(huì)陷入未響應(yīng)這個(gè)程序目前傳送前的通信內(nèi)容只有文件長(zhǎng)度,可以加入文件名稱等內(nèi)容來增強(qiáng)用戶體驗(yàn)。已經(jīng)實(shí)現(xiàn)了多線程的文件傳輸。八、軟件使用說明服務(wù)端點(diǎn)擊chooseyourfile按鈕選擇要傳輸?shù)奈募?,文件路徑?huì)顯示在下方,載PORT出輸入用處通信的端口號(hào),點(diǎn)擊confirm按鈕確認(rèn),點(diǎn)擊threads進(jìn)行多線程發(fā)送貨點(diǎn)擊listen進(jìn)行單線程發(fā)送;客戶端點(diǎn)擊chooseyourfile選擇存儲(chǔ)路徑和文件名稱,在IP和PORT輸入主機(jī)的IP地址和用于通信的端口號(hào),點(diǎn)擊confirm確認(rèn)內(nèi)容,點(diǎn)擊threads進(jìn)行多線程接收或accept進(jìn)行單線程接收。九、參考資料QT5官方幫助文檔網(wǎng)絡(luò)上一些介紹winsocket通信的文章一些API相關(guān)說明十、驗(yàn)收時(shí)間及驗(yàn)收情況1月3日星期天樊玉琦老師驗(yàn)收老師提出了網(wǎng)卡是串行傳輸數(shù)據(jù)的,多線程怎么加快文件傳輸速度的問題,由于這方面網(wǎng)絡(luò)上資料比較少,我個(gè)人認(rèn)為,發(fā)送數(shù)據(jù)數(shù)先讀在發(fā),可能多線程是利用了讀的時(shí)間,別的線程發(fā)送,發(fā)送時(shí),別的線程在讀,這樣分時(shí)的方式加快文件傳送速度的。十一、設(shè)計(jì)體會(huì)這次課程設(shè)計(jì),我花了一個(gè)多星期來學(xué)習(xí)相關(guān)內(nèi)容,很多東西都是我本來不會(huì)的,比如QT,windowsC++多線程,線程函數(shù)在類中如何控制等,在完成了這個(gè)比較完整的課程設(shè)計(jì)后,但是由于網(wǎng)上資料較少,我暫時(shí)還沒有學(xué)會(huì)將VS20XX中的帶QT庫的文件生成可執(zhí)行文件,所以只能上交項(xiàng)目文件…這次實(shí)驗(yàn)讓我比較深刻的體會(huì)了winsocket網(wǎng)絡(luò)通信的原理,也讓我發(fā)現(xiàn)了影響網(wǎng)絡(luò)傳輸速度的程序方面的因素,比如發(fā)送緩沖區(qū)的大小,線程數(shù)等。計(jì)算機(jī)網(wǎng)絡(luò)是很復(fù)雜的,各種因素和各種協(xié)議,傳輸方式都影響著網(wǎng)絡(luò)通信的質(zhì)量,在網(wǎng)絡(luò)滲透在生活的各個(gè)方面的今天,對(duì)于一個(gè)學(xué)習(xí)計(jì)算機(jī)的人來說,掌握好網(wǎng)絡(luò)方面的知識(shí)更加的重要。

路由器配置實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?.認(rèn)識(shí)路由器的端口、型號(hào)2.掌握路由器的路由配置3.理解網(wǎng)絡(luò)互聯(lián)的基本原理實(shí)驗(yàn)環(huán)境與設(shè)備本實(shí)驗(yàn)在PC機(jī)上利用模擬軟件PacketTracerV6進(jìn)行操作。實(shí)驗(yàn)內(nèi)容1.路由器接口的配置 2.靜態(tài)路由配置3.默認(rèn)路由配置4.動(dòng)態(tài)路由配置本次實(shí)驗(yàn)的主要任務(wù)是了解路由器的基本設(shè)置,和網(wǎng)絡(luò)之間的連接關(guān)系。通過這次的實(shí)驗(yàn)很好的掌握了各個(gè)網(wǎng)段之間的,各個(gè)路由器下的pc的連接情況。通過對(duì)靜態(tài),默認(rèn),動(dòng)態(tài)路由配置,使得各個(gè)路由器下的PC相互通信。四、實(shí)驗(yàn)步驟1.路由器接口的配置創(chuàng)建如圖所示的拓?fù)浣Y(jié)構(gòu)圖。(1)為主機(jī)PC0,PC1,PC2配置IP地址、子網(wǎng)掩碼和默認(rèn)網(wǎng)關(guān)為路由器的各個(gè)接口分配IP地址和子網(wǎng)掩碼,交換機(jī)不用配置。(3)查看路由器的路由表使用命令:showiproute顯示路由表中的路由信息。保存此時(shí)路由器顯示的路由信息,以便與后面的實(shí)驗(yàn)結(jié)果進(jìn)行比較。(4)測(cè)試主機(jī)之間的連通性2.配置靜態(tài)路由(1)在Router0中添加一條到網(wǎng)絡(luò)192.168.3.0的靜態(tài)路由,命令如下:Router(config)#iproute192.168.3.0255.255.255.0172.16.1.1(2)再去查看Router0路由表,與步驟中2的路由表進(jìn)行對(duì)比,觀察路由表變化情況。(3)在Router2中添加一條到網(wǎng)絡(luò)192.168.1.0的路由后,路由表如下:Router(config)#iproute192.168.1.0255.255.255.0172.16.1.2(4)測(cè)試PC0與PC2的連通性(5)在Router1和Router2中各添加一條靜態(tài)路由,以實(shí)現(xiàn)PC1與PC2的互通。(6)測(cè)試PC0與PC1的連通性(7)請(qǐng)分別在Router0和Router1中添加靜態(tài)路由,以實(shí)現(xiàn)PC0與PC1的互通。請(qǐng)?jiān)趯?shí)驗(yàn)報(bào)告中記錄你所使用的配置命令、主機(jī)間的連通性測(cè)試結(jié)果以及Router0和Router1的路由表(以截圖形式)。3.設(shè)置默認(rèn)路由(1)首先刪除Router0中到達(dá)PC1和PC2所在網(wǎng)絡(luò)的靜態(tài)路由,參考在Router0中添加一條默認(rèn)路由再測(cè)試PC0與PC1,PC2的連通性。4.動(dòng)態(tài)路由協(xié)議RIP配置(1)查看三個(gè)路由器的路由表信息,可看到此時(shí)路由表中只有直連路由C。在Router0上配置RIP協(xié)議在Router1,Router2上配置RIP協(xié)議的命令同上。查看三個(gè)路由器的路由表,可看到各路由器學(xué)到的網(wǎng)段。測(cè)試各主機(jī)間的連通性五.實(shí)驗(yàn)心得通過使用CiscoPacket

溫馨提示

  • 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)論