多線程網(wǎng)絡文件傳輸系統(tǒng)的設計與實現(xiàn)畢業(yè)論文_第1頁
多線程網(wǎng)絡文件傳輸系統(tǒng)的設計與實現(xiàn)畢業(yè)論文_第2頁
多線程網(wǎng)絡文件傳輸系統(tǒng)的設計與實現(xiàn)畢業(yè)論文_第3頁
多線程網(wǎng)絡文件傳輸系統(tǒng)的設計與實現(xiàn)畢業(yè)論文_第4頁
多線程網(wǎng)絡文件傳輸系統(tǒng)的設計與實現(xiàn)畢業(yè)論文_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

39/54畢業(yè)設計(論文)標題問題多線程網(wǎng)絡文件傳輸系統(tǒng)的設計與實現(xiàn)學生姓名學號專業(yè)班級指導教師評閱教師完成日期 2021年 5月15日學位論文原創(chuàng)性聲明本人鄭重聲明:所呈交的論文是本人在導師的指導下獨立進行研究所取得的研究成果。除了文中分外加以標注引用的內容外,本論文不包含任何其他個人或團隊已經(jīng)頒布或撰寫的成果作品。本人完全意識到本聲明的法令后果由本人承擔。作者簽名:年月日學位論文版權使用授權書本學位論文作者完全了解學校有關保障、使用學位論文的規(guī)定,同意學校保留并向有關學位論文辦理部門或機構送交論文的復印件和電子版,允許論文被查閱和借閱。本人授權省級優(yōu)秀學士學位論文評選機構將本學位論文的全部或部分內容編入有關數(shù)據(jù)庫進行檢索,可以采用影印、縮印或掃描等復制手段保留和匯編本學位論文。本學位論文屬于1、保密□,在_________年解密后適用本授權書。2、不保密□。(請在以上相應方框內打“√”)作者簽名:年月日導師簽名:年月日

目錄摘要……………1前言……………21緒論…………41.1研究背景及意義………………41.2國表里研究現(xiàn)狀………………41.3本文研究內容…………………52系統(tǒng)需求分析………………62.1功能模塊描述…………………62.2軟件需要實現(xiàn)功能……………72.3通信原理及過程………………73主要實現(xiàn)技術………………83.1關鍵要點分析…………………83.2數(shù)據(jù)傳輸協(xié)議……………83.3C/S構架……………………123.4多線程編程…………………123.5多線程技術…………………133.6文件的分塊…………………153.7多線程文件傳輸與斷點續(xù)傳…………………163.8Windowssocket編程………163.9套接字和客戶—辦事器通信…………………204系統(tǒng)概要設計與實現(xiàn)………204.1通信過程……………………214.2SOCKET建立連接過程………214.3文件的傳輸…………………235系統(tǒng)功能的演示……………255.1辦事器和客戶端運行界面……………………255.2文件傳輸?shù)难菔尽?66總結與展望…………………286.1本文完成的主要工作………286.2未來研究展望………………28致謝……………29參考文獻………………………30多線程網(wǎng)絡文件傳輸系統(tǒng)的設計與實現(xiàn)摘要:文件傳輸是因特網(wǎng)上最常用的辦事之一,多線程文件傳輸能有效地提高文件傳輸?shù)乃俣群托剩鞠到y(tǒng)采用windowssocket實現(xiàn),套接字可以看成是兩個網(wǎng)絡應用軌范進行通信時,各自通信連接中的一個端點。系統(tǒng)分客戶端軟件和辦事器端軟件兩部分,同時需要用到多線程相關知識,一個應用軌范可以同時有多個線程一起運用CPU的資源,大大的加強對CPU的利用率,同時也從另一個方面加快了傳輸?shù)乃俣取S捎赥CP/IP連接協(xié)議的辦事是設計客戶端/辦事器應用軌范時的主流標準,所以本軟件主要采用TCP/IP協(xié)議的網(wǎng)絡通信技術;客戶端,辦事器類是從CAsyncSocket類中繼承來的,因此本軟件通信完全是異步的;軌范在WindowsXP系統(tǒng)、VisualC++6.0下編譯通過,且運行良好。關鍵詞:文件傳輸套接字多線程Abstract:isoneofthemostcommonlyusedservicesontheInternet,amulti-threadedcaneffectivelyimprovethespeedandefficiency,thissystemusetheWindowssocketsimplementation,Socketcanberegardedastwonetworkapplicationsforcommunications,eachanendpointofcommunication.Clientsoftwareandserversoftwaresystempointstwoparts,theneedtousemultithreadingknowledgeatthesametime,anapplicationcanhavemultiplethreadsatthesametimewiththeuseofCPUresources,greatlystrengthentheCPUutilization,butalsofromanotheraspecttospeedupthetransmissionspeed.AsTCP/IPagreementlinkingtheserviceisdesignedclient/serverapplicationproceduresforthemainstreamstandards,Therefore,thesoftwareusedmainlyTCP/IPagreementnetworkcommunicationtechnology;client,serverfromCAsyncSocketinheritedcategory,andthereforethesoftwareiscompletelyasynchronouscommuni-cation;proceduresinWindowsXPsystemandunderVisualC++6.0compiler,andRunningwellKeywords:TheThesocketmultithreading前言如今隨著計算機應用的普及,已經(jīng)有越來越多的人正在Internet(國際互聯(lián)網(wǎng))上暢游,許多人也已經(jīng)將進入Internet作為下一個計算機升級的方針,而使用Internet進行文件傳輸,則是計算機聯(lián)入Internet的一個重要功能之一。下面我們詳細地談一談如何使用Internet的FTP功能進行文件傳輸。

FTP中文意思為文件傳輸協(xié)議,用于辦理計算機之間的文件傳送。一般說來,我們聯(lián)網(wǎng)的主要目的就是實現(xiàn)信息共享,而文件傳輸則是計算機間實現(xiàn)信息共享的一個非常重要的內容之一。在Internet上早期實現(xiàn)文件傳輸并不是一件很容易的事,因為Internet是一個非常復雜的計算機環(huán)境,有個人電腦、工作站、MAC、辦事器、還有大型機等。據(jù)統(tǒng)計目前連接在Internet上的計算機已經(jīng)有四千多萬臺,并且每年正在以20%的速度增長。而這些連接在網(wǎng)上的計算機也在各自運行著分歧的操作系統(tǒng),有運行Windows、Dos的個人電腦,有運行MacOS的蘋果機,也有運行unix的辦事器等,而各種操作系統(tǒng)的文件結構也各不相同。要解決這種異種機、異種操作系統(tǒng)之間的文件傳輸交流問題,需要建立一個統(tǒng)一的文件傳輸協(xié)議,這就是FTP。基于分歧的計算機操作系統(tǒng),就有分歧的FTP應用軌范,而所有的這些應用軌范都遵守同一種協(xié)議,這樣我們就可以把本身的文件傳送給別人,或者從其他的計算機用戶中獲得文件。因此文件傳輸凡是就是指計算機利用Internet進行文件傳輸?shù)霓k事。FTP允許您從數(shù)以千計的遠程主機上把文件傳輸?shù)侥闹鳈C上,您可以傳輸計算機軌范、圖像、聲音、電影或其它任何文件。FTP用于Internet上的控制文件的雙向傳輸。在實現(xiàn)的層面上,F(xiàn)TP又可理解為一個可用于文件傳輸?shù)目蛻魴C/辦事器系統(tǒng)(C/S架構),該系統(tǒng)包孕客戶機端軌范和辦事器端軌范,客戶端和辦事器端通信軌則為FTP協(xié)議。用戶通過客戶機軌范向辦事器軌范發(fā)出命令請求,辦事器軌范執(zhí)行用戶所發(fā)出的命令,并將執(zhí)行的結果返回到客戶機。比如說,用戶發(fā)出一條命令,要求辦事器向用戶傳送某一個文件的一份拷貝,辦事器會響應這條命令,將指定文件送至用戶的機器上??蛻魴C軌范接收到這個文件,將其存放在用戶目錄中。在通信協(xié)議的分層模型中,文件傳輸協(xié)議是在TCP(TransmissioncontrolProtocol,傳輸控制協(xié)議)之上的一個應用層協(xié)議,應用軌范之間的通信需要用到傳輸層提供的字節(jié)流透明無誤傳輸辦事。Windows操作系統(tǒng)具有TCP/IP協(xié)議棧,應用軌范可通過WinsockAPI函數(shù)的調用實現(xiàn)端到端透明數(shù)據(jù)鏈接的建立。網(wǎng)絡應用軌范是一種在分歧系統(tǒng)的新進程間通過網(wǎng)絡通信協(xié)議進行的進程間的通信問題。在網(wǎng)絡中為了標識通信的進程,首先要標識網(wǎng)絡中進程所在的主機,其次要標識主機用IP地址來標識分歧的主機,主機上分歧的進程要用使用端口號來標識。其次,在Windows中編程是通過套接字SOCKET來編程的,套接字可以看成是兩個網(wǎng)絡應用軌范進行的通信時,各自通信連接種的一個端點。通信時,其中的一個網(wǎng)絡應用軌范將要傳輸?shù)囊欢涡畔懭胨谥鳈C的Socket中,該Socket通過網(wǎng)絡接口卡NIC的傳輸介質將這段信息發(fā)送到另一臺主機的Socket種,使這段信息能穿傳送到其他軌范中。要通過Internet進行通信,至少需要一對套接字,其中一個運行在客戶端,稱之為ClientSocket,另一個運行于辦事器端面,稱為ServerSocket。按照連接啟動的方式以及本地要連接的方針,套接字之間的連接過程可以分為三個步驟:辦事器監(jiān)聽、客戶端請求、連接確認。辦事器監(jiān)聽是指辦事端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡狀態(tài)。客戶端請求是由客戶端的套接字提出連接請求,要連接的方針是辦事器端套接字。為此,客戶端的套接字必需首先描述它要連接的辦事器的套接字,指出辦事器套接字的地址和端口號,然后再向辦事器端套接字提出連接請求。連接確認是當辦事器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,它就響應客戶端套接字的請求,建立一個新的線程,把辦事器端套接字的信息發(fā)送給客戶端,一旦客戶端確認了此連接,連接即可建立。而辦事器端繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端的連接請求。網(wǎng)絡傳輸文件的時候還需要用到多線程和線程間拜候互斥文件的問題。創(chuàng)建線程后,一個應用軌范可以同時有多個線程一起運用CPU的資源,大大的加強對CPU的利用率。同時也從另一個方面加快了傳輸?shù)乃俣取5且龅揭粋€問題就是各個線程對文件的共享問題。所以建立好的信號量來實現(xiàn)他們之間的拜候軌則是很重要的。否則,傳輸?shù)奈募浩鸷芏鄦栴}。1緒論這一部分主要介紹多線程文件傳輸?shù)南嚓P背景和研究的意義,大致概括了國表里研究的現(xiàn)狀,最后說明了本系統(tǒng)需要研究的主要內容。1.1研究背景及意義1.1.1研究背景目前,國表里企業(yè)對局域網(wǎng)的文件傳輸系統(tǒng)認識和使用情況并不好,各個企業(yè)單位在局域網(wǎng)內實現(xiàn)文件傳輸,資源共享還有很大的缺陷。技術無論是從理論上或實踐上都還不夠完善。文件傳輸系統(tǒng)由于比力復雜,可變因素較多,安全性低,因此發(fā)展還不成熟。但是隨著科學技術的發(fā)展,各種以局域網(wǎng)為單位的文件傳輸系統(tǒng)已經(jīng)進入穩(wěn)健發(fā)展期,比如說市面上比力遍及使用的QQ、UC、飛鴿傳書等以內部網(wǎng)絡為中心的資源共享系統(tǒng)也即將進入高速發(fā)展期。在國內,隨著企業(yè)資源辦理的規(guī)范化和規(guī)模的不斷擴大,企業(yè)的計算機資源辦理將不僅僅逗留在依靠硬件或者Internet網(wǎng)絡獲取,而且將會向著安全的內部網(wǎng)絡化資源辦理方式邁進。1.1.2研究意義1.學會采用多線程提高傳輸速度文件傳輸是因特網(wǎng)上最常用的辦事之一,多線程文件傳輸能有效地提高文件傳輸?shù)乃俣群托省?.學會利用windowssocket進行高性能開發(fā)本系統(tǒng)采用windowssocket實現(xiàn),windowssocket是因特網(wǎng)上進行通信軌范設計的常用方式,是開發(fā)高性能網(wǎng)絡軌范的基礎,采用socket方式可以編寫出滿足各種應用需要的網(wǎng)絡軌范,具有很強的適應性。3.掌握網(wǎng)絡底層開發(fā)技術本課題通過對網(wǎng)絡文件傳輸系統(tǒng)的開發(fā),使我掌握socket編程技巧,熟悉網(wǎng)絡底層軟件開發(fā)方式。1.2國表里研究現(xiàn)狀目前,國表里企事業(yè)單位對文件傳輸系統(tǒng)的認識和使用情況并不好,各企事業(yè)單位大多在局域網(wǎng)內實現(xiàn)文件傳輸,資源共享方面還存在較多缺陷,對相關技術的理論研究也不夠深入。由于文件傳輸系統(tǒng)的復雜性、多變性、安全性低等特點,使得其發(fā)展還不夠成熟。隨著科學技術的發(fā)展,各種以局域網(wǎng)或是廣域網(wǎng)為基礎的文件傳輸系統(tǒng)已經(jīng)進入穩(wěn)健發(fā)展時期。而計算機網(wǎng)絡通信技術已趨于成熟,促使應用于文件傳輸?shù)能浖N類不斷增多。由于網(wǎng)絡編程技術的發(fā)展,人們使用的文件傳輸軟件也浮現(xiàn)出更多的高性能、易操作、穩(wěn)定好等特點,但是開發(fā)者在注重下載功能實現(xiàn)的同時,往往忽略了用戶上傳文件的需要。在國外,用戶使用的傳輸軟件主要有網(wǎng)絡螞蟻(NetAnt)和網(wǎng)際快車(FlashGet)。這些軟件大都是針對用戶下載來設計的,能夠實現(xiàn)功能完善的下載辦事。在國內,用戶使用的文件傳輸軟件主要是迅雷和飛鴿傳書。迅雷主要針對的是文件快速下載的實現(xiàn),而飛鴿傳書則主要應用于局域網(wǎng)中的文件共享。目前常用的文件傳輸軟件往往功能比力單一,也缺乏良好的用戶使用界面和便當快捷的辦事。許多軟件在斷點續(xù)傳、多線程傳輸、進度顯示以及文件的動態(tài)壓縮等方面還存有欠缺。隨著企事業(yè)單位資源辦理的規(guī)范化和規(guī)模的不斷擴大,計算機的資源辦理以及辦公文檔的發(fā)布和傳遞將不僅僅逗留在依靠硬件或者電子郵件的獲取上,而是會向著更全面、更可靠、更快捷的標的目的發(fā)展。過去,企事業(yè)單位往往將文件傳輸系統(tǒng)與OA系統(tǒng)結合在一起并將其作為OA系統(tǒng)的一個模塊來處理。對于文檔傳輸模塊的設計,凡是都是為辦公文檔辦理而設計,并不能考慮到一些特殊文檔的辦理情況,例如多個文檔同時傳輸?shù)母咝Т鎯Π莺虻膯栴}等。綜上所述,目前的文件傳輸系統(tǒng)在文件多線程傳輸?shù)膶崿F(xiàn)上還不是很完善,雖然可供用戶選擇的文件傳輸軟件種類繁多,但仍然存在質量良莠不齊、功能各有異同的問題,用戶在使用的時候也總會遇到諸多的不便,需要對一些技術做進一步的改善和提高,對于那些經(jīng)常需要同時傳輸多個文件的特殊行業(yè)和生產(chǎn)范疇,更加需要有針對性的進行改善。1.3本文研究內容1.軟件設計原理本軟件是在Windows操作系統(tǒng)下,VisualC++6.0環(huán)境下借用WinSock控件實現(xiàn)的,是基于TCP/IP協(xié)議的C/S模式,在辦事器端和客戶端分別以socket為中心進行編程,客戶端和辦事器端的界面分別是由文件發(fā)送模塊和文件接收模塊組成??蛻舳讼日{用connect()與辦事器建立連接,然后用send()發(fā)送數(shù)據(jù);辦事器端先調用listen()偵聽客戶端的連接請求,然后調用accept()對連接請求進行響應,如果需要接收數(shù)據(jù),則會調用receive()接收。2.軟件設計思路我設計實現(xiàn)的多線程文件傳輸系統(tǒng)主要包孕兩個大的部分:辦事器端和客戶端。其中辦事器端開啟辦事,監(jiān)聽客戶端的連接,然后如果有客戶端開啟,建立了連接以后,就可以由辦事器端選擇文件來進行發(fā)送傳輸。在辦事器端,因為是多線程傳輸,會有文件的分割,所以文件傳輸?shù)臅r候可以選擇較大的文件進行傳輸,客戶端同時也是和辦事器端一樣用多線程進行連接和接收,同時客戶端可以開啟多個,并同時接收辦事器傳輸?shù)奈募?.軟件主要功能本文件傳輸系統(tǒng)主要實現(xiàn)了辦事器端和客戶端的文件傳輸,并且采用多線程技術,有效地提高了文件傳輸?shù)男?。軟件研究了Windows多線程編程技術,使用流式套接字來完成辦事器端與客戶端連接。按照客戶端對辦事器端拜候的特點,在辦事器端采用異步方式監(jiān)聽客戶端的連接請求,避免客戶端長時間等待辦事器端的回應泛起卡死現(xiàn)象,更好的完成客戶的文件傳輸需求,充分利用辦事器端的系統(tǒng)資源。2需求分析這一部分主要對多線程文件傳輸系統(tǒng)需要實現(xiàn)的基本功能進行描述以及介紹了辦事器和客戶端進行通信的基本原理。2.1功能模塊描述我設計實現(xiàn)的文件傳輸系統(tǒng)主要包孕兩個大的部分:辦事器端和客戶端。即傳統(tǒng)的C/S模式,其中辦事器端開啟辦事,監(jiān)聽客戶端的連接,然后如果有客戶端開啟,建立了連接以后,就可以由辦事器端選擇文件來進行發(fā)送傳輸,首先是添加文件到辦事器端,客戶端接收文件時,點擊接收是首先獲取的是相關文件的地址信息,然后你雙擊保留文件到相關文件夾,這時候辦事器就會調用相關線程進行傳送。辦事器只能開啟一個,并向客戶端傳送文件,客戶端可以開啟多個,并且可以同時接收辦事器的文件,傳送文件時,辦事器可以實現(xiàn)對文件的分割,所以可以傳送較大的文件。系統(tǒng)不僅可以在同一臺PC機上傳輸,同時可以在局域網(wǎng)內傳輸,體現(xiàn)了網(wǎng)絡傳輸?shù)墓δ堋?.2軟件需要實現(xiàn)的功能這里就分別介紹了辦事器和客戶端需要完成的功能,其中由于文件只能從辦事器發(fā)送到客戶端,而不能從客戶端發(fā)送到辦事器,所以在文件傳輸時辦事器只能發(fā)送文件而客戶端只能接收文件。2.2.1辦事器端的應用軌范將完成如下功能——監(jiān)聽客戶端的連接請求——為請求連接的客戶端建立SOCKET隊列——向客戶端發(fā)送消息——從客戶端接收消息——向客戶端發(fā)送文件2.2.2客戶端的通信軌范將完成如下功能——建立與辦事器的連接——封鎖與辦事器的連接——向辦事器發(fā)送消息——從辦事器接收消息——從辦事器接收文件2.3通信原理及過程大大都通過網(wǎng)絡進行通信的應用軌范,非論是通過因特網(wǎng)還是小型的辦公網(wǎng)絡,它們都使用同樣的原則和功能來執(zhí)行通信。計算機上的一個應用軌范正在等待另一個軌范打開通信連接,可以說這前一個應用軌范正在“偵聽”該連接請求,這很像你在等待或人給你打電話時,一直在留心電話鈴聲。與時同時,另一個應用軌范,一般是運行在另一臺計算機上(當然也可以是同一臺機器上),試圖同第一個應用軌范連接。這種試圖找開連接的方式就類似于向或人打電話。你撥了電話號碼,并希望要找的那個人正在電話線的另一頭等接電話。當然,要完成電話的呼叫,必需知道被呼叫方的電話號碼。同樣的道理,試圖連接到第一個應用軌范的這個軌范也必需知道第一個應用軌范的網(wǎng)絡位置或網(wǎng)絡地址。一旦兩個應用軌范建立了連接,它們之間就可以互相發(fā)送和接收消息。正像兩個人打電話扳談一樣,這個連接是一個雙向的通道,即雙方都可以發(fā)送消息。最后,如果一方或雙方完成了對話,連接即封鎖,就像打完電話一樣,你能夠知道電話中的對方是否把電話給掛斷了,或者雙方由于其它原因連接不上了。一旦該應用軌范同一個應用軌范之間建立了連接,就能夠在它的對話框里鍵入要發(fā)送的文本消息,并把它們發(fā)送給另一個應用軌范。消息被發(fā)送之后,就被加到已發(fā)送消息的列表中。接收到的每一條消息都被復制到所有已收到的消息列表中。這樣就能看到完整的已發(fā)送和已接收到的消息列表,還可以對發(fā)送消息的應用軌范和接收消息的應用軌范進行比力。3主要實現(xiàn)技術這一部分主要介紹實現(xiàn)本系統(tǒng)相關功能需要用到的核心技術,并對相關技術進行了具體的介紹。3.1關鍵要點分析文件傳輸?shù)谋举|用一句話概括就是:發(fā)送方將文件數(shù)據(jù)讀出來,然后調用套接字的發(fā)送函數(shù)將數(shù)據(jù)傳輸?shù)浇邮辗剑邮辗秸{用套接字接收函數(shù)接收數(shù)據(jù),然后重新建立文件并將數(shù)據(jù)寫入文件。TCP協(xié)議提供的是可靠的、面向連接的傳輸控制協(xié)議,即在傳輸數(shù)據(jù)前要先建立邏輯連接,然后再傳輸數(shù)據(jù),最后釋放連接3個過程。TCP提供端到端通信;采用字節(jié)流方式,如果字節(jié)流太長,將其分段;提供緊急數(shù)據(jù)傳送功能。多線程可以同步完成多項任務,不是為了提高運行效率,而是為了通過提高資源使用效率來提高系統(tǒng)的效率。線程是一組指令的集合,或者是軌范的特殊段,它可以在軌范里獨立執(zhí)行,也可以把它理解為代碼運行的上下文。線程負責在單個軌范里執(zhí)行多任務,凡是由操作系統(tǒng)負責多個線程的調度和執(zhí)行。WINSOCK是在Windows進行網(wǎng)絡通信編程的API接口,也是Windws網(wǎng)絡編程的事實標準。在網(wǎng)絡編程中最常用的方案便是客戶機/辦事器模型。WindowsSockets規(guī)范定義并記錄了如何使用API與Internet協(xié)議族(IPS,凡是我們指的是TCP/IP)連接,尤其要指出的是所有的WindowsSockets實現(xiàn)都支持流套接口和數(shù)據(jù)報套接口。3.2數(shù)據(jù)傳輸協(xié)議以及選擇TCP作為本系統(tǒng)的傳輸協(xié)議1.TCP協(xié)議TCP協(xié)議提供的是可靠的、面向連接的傳輸控制協(xié)議,即在傳輸數(shù)據(jù)前要先建立邏輯連接,然后再傳輸數(shù)據(jù),最后釋放連接3個過程。TCP提供端到端、全雙工通信;采用字節(jié)流方式,如果字節(jié)流太長,將其分段;提供緊急數(shù)據(jù)傳送功能。TCP協(xié)議被稱作一種端對端協(xié)議。這是因為它為兩臺計算機之間的連接起了重要感化:當一臺計算機需要與另一臺遠程計算機連接時,TCP協(xié)議會讓它們建立一個連接、發(fā)送和接收數(shù)據(jù)以及終止連接。TCP協(xié)議利用重發(fā)技術和擁塞控制機制,向應用軌范提供可靠的通信連接,使它能夠自動適應網(wǎng)上的各種變化。即使在Internet暫時泛起堵塞的情況下,TCP也能夠包管通信的可靠。2.UDP協(xié)議用戶數(shù)據(jù)報協(xié)議(UDP)如下圖所示,它為高層應用提供了IP的無連接特性分組傳輸通路,在分歧計算機之間實現(xiàn)一條數(shù)據(jù)流。如果檢測到錯誤,分組將被丟棄,且不會執(zhí)行進一步的動作。UDP被稱為“無連接”的,因為它不需要握手,在發(fā)生差錯時也不需要重傳數(shù)據(jù)?;旧?,UDP在IP上增加了端口尋址功能。報頭包孕源端口和目的端口、長度字段(包孕報頭和數(shù)據(jù)的長度)和校驗和,UDP中的校驗和字段是可選的。UDP雖然不如TCP可靠,卻可以在網(wǎng)絡上快速地發(fā)送大量的數(shù)據(jù),因而可以用于廣播。它允許應用在任何時刻向任何地址發(fā)送報文。因此,它凡是用于多媒體應用,如實時的視頻會議,流式音頻和視頻以及因特網(wǎng)電話。所用這些應用可以容忍小部分的分組丟失,但UDP沒有任何的擁堵控制法子。分組在路由器上可能會發(fā)生溢出,從而帶來嚴重的問題,但是,差錯校驗和序列編號等功能也可以加入到選用UDP的應用中去?,F(xiàn)在,很多流應用運行在UDP之上,但是它們內建了應答和重傳以減少分組的丟失。不是所用的TCP通信量始終都能通過所有的防火墻,UDP經(jīng)常用作視頻和音頻流(例如RealAudio)的傳輸方式。位:015318個八位位組8個八位位組源端口目的端口長度校驗和3.選擇TCP作為文件傳輸協(xié)議盡管TCP和UDP都使用相同的網(wǎng)絡層(IP),TCP卻向應用層提供與UDP完全分歧的辦事。TCP提供一種面向連接的、可靠的字節(jié)流辦事。面向連接意味著兩個使用TCP的應用(凡是是一個客戶和一個辦事器)在彼此交換數(shù)據(jù)之前必需先建立一個TCP連接。這一過程與打電話很相似,先撥號振鈴,等待對方摘機說“喂”,然后才說明是誰。在一個TCP連接中,僅有兩方進行彼此通信。廣播和多播不能用于TCP。TCP通過下列方式來提供可靠性:1.應用數(shù)據(jù)被分割成TCP認為最適合發(fā)送的數(shù)據(jù)塊。這和UDP完全分歧,應用軌范產(chǎn)生的數(shù)據(jù)報長度將保持不變。由TCP傳遞給IP的信息單位稱為報文段或段(segment)TCP如何確定報文段的長度。2.當TCP發(fā)出一個段后,它啟動一個按時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發(fā)這個報文段。當TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個確認。這個確認不是立即發(fā)送,凡是將推遲幾分之一秒3.TCP將保持它首部和數(shù)據(jù)的檢驗和。這是一個端到端的檢驗和,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(希望發(fā)端超時并重發(fā))。既然TCP報文段作為IP數(shù)據(jù)報來傳輸,而IP數(shù)據(jù)報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數(shù)據(jù)進行重新排序,將收到的數(shù)據(jù)以正確的按次交給應用層。5.TCP還能提供流量控制,TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機致使較慢主機的緩沖區(qū)溢出。兩個應用軌范通過TCP連接交換8bit字節(jié)構成的字節(jié)流。TCP不在字節(jié)流中插入記錄標識符。我們將這稱為字節(jié)流辦事(bytestreamservice)。如果一方的應用軌范先傳10字節(jié),又傳20字節(jié),再傳50字節(jié),連接的另一方將無法了解發(fā)方每次發(fā)送了多少字節(jié)。收方可以分4次接收這80個字節(jié),每次接收20字節(jié)。一端將字節(jié)流放到TCP連接上,同樣的字節(jié)流將泛起在TCP連接的另一端。3.2.1TCP建立連接的過程3.2.2TCP的辦事特點面向連接的傳輸端到端的通信高可靠性,確保傳輸數(shù)據(jù)的正確性,不泛起丟失或亂序;全雙工方式傳輸采用字節(jié)流方式,即以字節(jié)為單位傳輸字節(jié)序列;緊急數(shù)據(jù)傳送功能3.2.3TCP的重傳策略TCP協(xié)議用于控制數(shù)據(jù)段是否需要重傳的依據(jù)是設立重發(fā)按時器。在發(fā)送一個數(shù)據(jù)段的同時啟動一個重發(fā)按時器,如果在按時器超時前收到確認就封鎖該按時器,如果按時器超時前沒有收到確認,則重傳該數(shù)據(jù)段。在選擇重發(fā)時間的過程中,TCP必需具有自適應性。它需要按照互聯(lián)網(wǎng)當時的通信情況,給出合適的數(shù)據(jù)重發(fā)。這種重傳策略的關鍵是對按時器初值的設定。目前采用較多的算法是Jacobson于1988年提出的一種不斷調整超時時間間隔的動態(tài)算法。其工作原理是:對每條連接TCP都保持一個變量RTT(RoundTripTime),用于存放當前到目的端往返所需要時間最接近的估計值。當發(fā)送一個數(shù)據(jù)段時,同時啟動連接的按時器,如果在按時器超時前確認到達,則記錄所需要的時間(M),并修正RTT的值,如果按時器超時前沒有收到確認,則將RTT的值增加1倍。通過測量一系列的RTT(往返時間)值,TCP協(xié)議可以估算數(shù)據(jù)包重發(fā)前需要等待的時間。在估計該連接所需的當前延遲時凡是利用一些統(tǒng)計學的原理和算法(如Karn算法),從而獲得TCP重發(fā)之前需要等待的時間值。3.3C/S構架C/S(Client/Server)結構,即大師熟知的客戶機和辦事器結構。它是軟件系統(tǒng)體系結構,通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務合理分派到Client端和Server端來實現(xiàn),降低了系統(tǒng)的通訊開銷。目前大大都應用軟件系統(tǒng)都是Client/Server形式的兩層結構,由于現(xiàn)在的軟件應用系統(tǒng)正在向分布式的Web應用發(fā)展,Web和Client/Server應用都可以進行同樣的業(yè)務處理,應用分歧的模塊共享邏輯組件;因此,內部的和外部的用戶都可以拜候新的和現(xiàn)有的應用系統(tǒng),通過現(xiàn)有應用系統(tǒng)中的邏輯可以擴展出新的應用系統(tǒng)。這也就是目前應用系統(tǒng)的發(fā)展標的目的。3.3.1客戶端(Client)客戶端(Client)或稱為用戶端,是指與辦事器相對應,為客戶提供本地辦事的軌范。一般安裝在普通的客戶機上,需要與辦事端互相配合運行。因特網(wǎng)發(fā)展以后,較常用的用戶端包孕了如萬維網(wǎng)使用的網(wǎng)頁瀏覽器,收寄電子郵件時的電子郵件客戶端,以及即時通訊的客戶端軟件等。3.3.2辦事器(Server)辦事器指一個辦理資源并為用戶提供辦事的計算機軟件,凡是分為文件辦事器、數(shù)據(jù)庫辦事器和應用軌范辦事器。運行以上軟件的計算機或計算機系統(tǒng)也被稱為辦事器。相對于普通PC來說,辦事器在穩(wěn)定性、安全性、性能等方面都要求更高,因此CPU、芯片組、內存、磁盤系統(tǒng)、網(wǎng)絡等硬件和普通PC有所分歧。3.4多線程編程由于用到對話框,所以單線程的操作會嚴重影響軌范功能的實現(xiàn),所以采用多線程操作,使得在打開一個對話框時,不會影響到另一個對話框的功能,在MFC軌范中創(chuàng)建一個線程,調用AfxBeginThread函數(shù):CWinThreadAfxBeginThread(AFX_THREADPROCpfnThreadProc,控制函數(shù)LPVOIDpParam,傳遞給控制函數(shù)的參數(shù)intnPriority=THREAD_PRIORITY_NORMAL,線程的優(yōu)先級UINTnStackSize=0,線程的貨倉旅館大小DWORDdwCreateFlags=0,線程的創(chuàng)建符號LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL線程的安全屬性);結束進程:進程只是提供了一段地址空間和內核對象,其運行是通過在其地址空間內的主線程來體現(xiàn)的。當主線程的進入點函數(shù)返回時,進程也就隨之結束。這種進程的終止方式是進程的正常退出,進程中的所有線程資源都能夠獲得正確的清除。除了這種進程的正常退出方式外,有時還需要在軌范中通過代碼來強制結束本進程或其它進程的運行。Exit-Process()函數(shù)即可在進程中的某個線程中使用,并將立即終止本進程的運行。該函數(shù)具有強制性,在執(zhí)行完畢后進程即已經(jīng)被結束,因此位于其后的任何代碼將不能被執(zhí)行。雖然ExitProcess()函數(shù)可以在結束進程的同時通知與其相關聯(lián)的動態(tài)鏈接庫,但是由于它的這種執(zhí)行的強制性,使得ExitProcess()函數(shù)在使用大將存在安全隱患。3.5多線程技術3.5.1線程的組成線程有兩部分組成。1.一個是線程的內核對象,操作系統(tǒng)用它來對線程實施辦理。內核對象也是系統(tǒng)用來存放線程統(tǒng)計信息的地方。2.另一個是線程貨倉旅館,它用于維護線程在執(zhí)行代碼時需要的所有函數(shù)參數(shù)和局部變量。進程從來不執(zhí)行任何東西,它只是線程的容器。線程總是在某個進程環(huán)境中創(chuàng)建的,而且它的整個壽命期都在該進程中。這意味著線程在它的進程地址空間中執(zhí)行代碼,并且在進程的地址空間中對數(shù)據(jù)進行操作。因此,如果在單進程環(huán)境中,你有兩個或多個線程正在運行,那么這兩個線程將共享單個地址空間。這些線程能夠執(zhí)行相同的代碼,對相同的數(shù)據(jù)進行操作。這些線程還能共享內核對象句柄,因為句柄表依賴于每個進程而不是每個線程存在。線程是一種操作系統(tǒng)對象,它暗示在進程中代碼的一條執(zhí)行路徑。在每一個Win32的應用軌范中都至少有一個線程,它凡是被稱為主線程或默認線程。在應用軌范中也可以自由地創(chuàng)建別的線程去執(zhí)行其他任務。線程技術使分歧的代碼可以同時運行。當然,只有在多CPU的計算機上,多個線程才能夠真正地同時運行。在單個CPU上,由于操作系統(tǒng)把CPU的時間分成很短的片段分派給每個線程,這樣給人的感觸感染仿佛是多個線程真的同時運行,他們只是“看起來”同時在運行。3.5.2創(chuàng)建一個線程每個線程必需擁有一個進入點函數(shù),線程從這個進入點開始運行。線程函數(shù)可以使用任何合法的名字??梢越o線程函數(shù)傳遞單個參數(shù),參數(shù)的含義由你本身定義。線程函數(shù)必需由一個返回值,它將成為該線程的退出代碼。線程函數(shù)應該盡可能的使用函數(shù)參數(shù)和局部變量。當CreateThread被調用時,系統(tǒng)創(chuàng)建一個線程內核對象。該線程內核對象不是線程本身,而是操作系統(tǒng)用來辦理線程的較小的數(shù)據(jù)結構??梢詫⒕€程內核對象視為由關于線程的統(tǒng)計信息組成的一個小型數(shù)據(jù)結構。系統(tǒng)從進程的地址空間中分派內存,供線程的貨倉旅館使用。新線程運行的進程環(huán)境與創(chuàng)建線程的環(huán)境相同。因此,新線程可以拜候進程的內核對象的所有句柄、進程中的所有內存和在這個相同的進程中的所有其他線程的貨倉旅館。這使得單個進程中的多個線程確實能夠非常容易地互相通信。一旦內核對象創(chuàng)建完成,系統(tǒng)就分派用于線程的貨倉旅館的內存。該內存是從進程的地址空間分派而來的,因為線程并不擁有它本身的地址空間。然后系統(tǒng)將兩個值寫入新線程的貨倉旅館的上端(線程貨倉旅館總是從內存的高地址向低地址建立)。3.5.3線程的終止當線程終止運行時,會發(fā)生下列操作:線程擁有的所有效戶對象均被釋放。在Windows中,大大都對象是由包含創(chuàng)建這些對象的線程的進程擁有的。但是一個線程擁有兩個用戶對象,即窗口和掛鉤。當線程終止運行時,系統(tǒng)會自動撤消任何窗口,并且卸載線程創(chuàng)建的或安裝的任何掛鉤。其他對象只有在擁有線程的進程終止運行時才被撤消。線程的退出代碼從STILL_ACTIVE改為傳遞給ExitThread或TerminateThread的代碼線程內核對象的狀態(tài)變?yōu)橐淹ㄖ?。如果線程是進程中最后一個活動線程,系統(tǒng)也將進程視為已經(jīng)終止運行。線程內核對象的使用計數(shù)遞減1。當一個線程終止運行時,在與它相關聯(lián)的線程內核對象的所有未結束的引用封鎖之前,該內核對象不會自動被釋放。3.5.4線程的調度每個線程是擁有一個上下文結構的,這個結構維護在線程的內核對象中。這個上下文結構反映了線程上次運行時該線程的CPU寄存器的狀態(tài)。每隔20ms擺布,Windows要查看當前存在的所有線程內核對象。在這些對象中,只有某些對象被視為可以調度的對象。Windows選擇可調度的線程內核對象中的一個,將它加載到CPU的寄存器中,它的值是上次保留在線程的環(huán)境中的值。這項操作稱為上下文轉換。Windows實際上保留了一個記錄,它說明每個線程獲得了多少個運行機會。Windows被稱為搶占式多線程操作系統(tǒng),因為一個線程可以隨時停止運行,隨后另一個線程可進行調度。如你所見,可以對它進行必然程度的控制,但是不能太多。注意,無法包管線程總是能夠運行,也不能包管線程能夠獲得整個進程,無法包管其他線程不被允許運行等等。Windows系統(tǒng)只調度可以調度的線程。這意味著該線程已經(jīng)暫停運行,不應該給它放置任何CPU時間。在創(chuàng)建一個線程的時候,CreateThread函數(shù)接收的倒數(shù)第二個參數(shù)中賦值CREATE_SUSPENDED就可以創(chuàng)建一個暫停的線程。除了暫停的線程外,其他許多線程也是弗成調度的線程,因為它們正在等待某些事情的發(fā)生。3.6文件的分塊為便于各客戶端下載文件,文件被分成大小相等(最后一塊除州的若干塊。每一塊附上校驗信息,對于一個大的文件來說,這是很有必要的,因為傳輸層的校驗方式過于簡單,漏檢率較高。各客戶端以塊為單位下載文件,一塊下載完成后對該塊進行校驗,并和校驗信息進行比力,確認無誤后才認為該塊己被下載。文件分塊算法描述如下:欲下載某一文件的用戶首先獲得提供該文件的辦事器的地址(包孕IP地址和端口號,該辦事器必然得是公網(wǎng)上的一臺計算機,即該辦事器不位于任何NAT和防火墻之后)。與該辦事器通信。辦事器將記錄它所看到的該用戶的IP地址和端口號。該用戶向辦事器請求獲取1到2個文件塊,辦事器按照當前荷載情況決意是否讓該用戶下載文件塊。若同意該用戶下載文件塊,辦事器將優(yōu)先選擇還沒有被其他用戶下載的文件塊。向辦事器請求獲取必然數(shù)量的其他用戶的地址。辦事器隨機選擇必然數(shù)量的其他用戶的地址返回給該用戶,優(yōu)先選擇時延小的地址。該用戶與從辦事器獲得的其他用戶的地址通信,若不能直接通信,將請求辦事器輔助。用戶之間互相交換他們己經(jīng)下載的文件塊的信息,若需要(某用戶感覺本身的下載速度慢,且本身的網(wǎng)絡帶寬的利用率遠遠不夠,需要獲得更多的其他用戶的地址)的話交換他們所擁有的其他用戶的地址信息。用戶之間互相下載文件塊,直至文件的所有塊被下載。優(yōu)先下載稀有的文件塊,即只被少數(shù)用戶擁有的文件塊。由于各用戶下載文件時并不是像傳統(tǒng)的文件下載那樣從文件頭開始,直到文件尾,而是按必然的算法按次下載文件的各個塊,因此需要將已經(jīng)下載的文件塊合理地存放起來,便于所有的文件塊下載完成后恢復成本來的文件。該軟件下載過程前先申請空間,然后按下載的文件塊的序號,寫到相應的文件位置中。3.7多線程文件傳輸與斷點續(xù)傳在本系統(tǒng)中,文件的傳送是重要的功能之一,也是共享的基礎。本文件傳輸系統(tǒng)跟一些重要的協(xié)議像HTTP、FTP等一樣,都支持文件的多線程文件傳輸和斷點續(xù)傳功能。其目的就是為了解決網(wǎng)絡間的文件傳送問題,而且以其穩(wěn)定,高速,簡單而一直保持著很大的生命力。用來接收文件的客戶端的多線程文件傳輸是最重要,也最復雜,它負責線程的辦理,進度的記錄等工作。算法描述如下:先連接辦事器,統(tǒng)計能有多少在線用戶能提供某一文件的下載,然后按照文件長度和用戶數(shù)量決意分幾個線程下載,每一線程連接一個用戶,接著發(fā)送文件下載請求,請求包孕文件位置,名字,MD5校驗碼,需要文件的開始位置和結束位置等。開始下載后,各個線程將下載到的文件塊寫入到本地磁盤中。斷點續(xù)傳的算法描述如下:在實際網(wǎng)絡的傳輸過程中,總會因為各種原因讓文件的下載被終止,如果因為終止而使已經(jīng)下載的資源被廢棄,會造成大量的浪費,使用斷點續(xù)傳技術能很好地解決這一問題。斷點續(xù)傳的思想其實比力簡單,鄙人載文件的同時生成一個臨時文件,并記錄文件的一些相關信息,一旦文件停止下載,臨時文件保留上述信息,下次重新下載時先讀取文件的相關信息當各個線程開始下載以后,并記錄各個線程下載文件進程,每下載必然大小就記錄一次,并把文件下載進度寫到磁盤文件中,以防斷電,直到下載結束。當要實現(xiàn)斷點續(xù)傳時,先校驗本地文件的MD5校驗碼,如果校驗碼與源文件校驗碼一致,則不需要使用續(xù)傳。如果紛歧致,先查詢本地的文件進度文件,按照進度文件記錄的數(shù)值,向遠程用戶發(fā)送下載請求,文件的開始位置和結束位置為文件記錄的數(shù)值。3.8Windowssocket編程WindowsSockets規(guī)范定義并記錄了如何使用API與Internet協(xié)議族(IPS,凡是我們指的是TCP/IP)連接,尤其要指出的是所有的WindowsSockets實現(xiàn)都支持流套接口和數(shù)據(jù)報套接口。為了便當這種Client/Server模型的網(wǎng)絡編程,90年代初,由Microsoft聯(lián)合了其它幾家公司共同制定了一套WINDOWS下的網(wǎng)絡編程接口,即WindowsSockets規(guī)范,它不是一種網(wǎng)絡協(xié)議,而是一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡編程接口?,F(xiàn)在的Winsock已經(jīng)基本上實現(xiàn)了與協(xié)議無關,你可以使用Winsock來調用多種協(xié)議的功能,但較常使用的是TCPIP協(xié)議。Socket實際在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計算機通信。應用軌范在網(wǎng)絡上傳輸,接收的信息都通過這個Socket接口來實現(xiàn)。1.在初始化階段調用WSAStartup()此函數(shù)在應用軌范中初始化WindowsSocketsDLL,只有此函數(shù)調用成功后,應用軌范才可以再調用其它WindowsSocketsDLL中的API函數(shù)。在軌范中調用該函數(shù)的形式如下:WSAStartup((WORD)((181),(LPWSADATA)&WSAData),其中(181)暗示我們用的是WinSocket1.1版本,WSAata用來存儲系統(tǒng)傳回的關于WinSocket的資料。2.建立Socket初始化WinSock的動態(tài)連接庫后,需要在辦事器端建立一個監(jiān)聽的Socket,為此可以調用Socket()函數(shù)用來建立這個監(jiān)聽的Socket,并定義此Socket所使用的通信協(xié)議。此函數(shù)調用成功返回Socket對象,失敗則返回INVALID_SOCKET(調用WSAGetLastError()可得知原因,所有WinSocket的API函數(shù)都可以使用這個函數(shù)來獲取失敗的原因)。SOCKETPASCALFARsocket(intaf,inttype,intprotocol)3.綁定端口接下來要為辦事器端定義的這個監(jiān)聽的Socket指定一個地址及端口(Port),這樣客戶端才知道待會要連接哪一個地址的哪個端口,為此我們要調用bind()函數(shù),該函數(shù)調用成功返回0,否則返回SOCKET_ERROR。intPASCALFARbind(SOCKETs,conststructsockaddrFARname,intnamelen);參數(shù):s:Socket對象名;name:Socket的地址值,這個地址必需是執(zhí)行這個軌范所在機器的IP地址;namelen:name的長度;如果使用者不在意地址或端口的值,那么可以設定地址為INADDR_ANY,及Port為0,WindowsSockets會自動將其設定適當之地址及Port(1024到5000之間的值)。此后可以調用getsockname()函數(shù)來獲知其被設定的值。4.監(jiān)聽當辦事器端的Socket對象綁定完成之后,辦事器端必需建立一個監(jiān)聽的隊列來接收客戶端的連接請求。listen()函數(shù)使辦事器端的Socket進入監(jiān)聽狀態(tài),并設定可以建立的最大連接數(shù)(目前最大值限制為5,最小值為1)。該函數(shù)調用成功返回0,否則返回SOCKET_ERROR。intPASCALFARlisten(SOCKETs,intbacklog);參數(shù):s:需要建立監(jiān)聽的Socket;backlog:最大連接個數(shù);辦事器端的Socket調用完listen()后,如果此時客戶端調用connect()函數(shù)提出連接申請的話,Server端必需再調用accept()函數(shù),這樣辦事器端和客戶端才算正式完成通信軌范的連接動作。為了知道什么時候客戶端提出連接要求,從而辦事器端的Socket在恰當?shù)臅r候調用accept()函數(shù)完成連接的建立,我們就要使用WSAAsyncSelect()函數(shù),讓系統(tǒng)主動來通知我們有客戶端提出連接請求了。該函數(shù)調用成功返回0,否則返回SOCKET_ERROR。intPASCALFARWSAAsyncSelect(SOCKETs,HWNDhWnd,unsignedintwMsg,longlEvent);參數(shù):s:Socket對象;hWnd:接收消息的窗口句柄;wMsg:傳給窗口的消息;lEvent:被注冊的網(wǎng)絡事件,也便是應用軌范向窗口發(fā)送消息的網(wǎng)路事件,該值為下列值FD_READ、FD_WRITE、FD_OOB、FD_ACCEPT、FD_CONNECT、FD_CLOSE的組合,各個值的具體含意為FD_READ:希望在套接字S收到數(shù)據(jù)時收到消息;FD_WRITE:希望在套接字S上可以發(fā)送數(shù)據(jù)時收到消息;FD_ACCEPT:希望在套接字S上收到連接請求時收到消息;FD_CONNECT:希望在套接字S上連接成功時收到消息;FD_CLOSE:希望在套接字S上連接封鎖時收到消息;FD_OOB:希望在套接字S上收到帶外數(shù)據(jù)時收到消息。具體應用時,wMsg應是在應用軌范中定義的消息名稱,而消息結構中的lParam則為以上各種網(wǎng)絡事件名稱。5.辦事器端接受客戶端的連接請求當Client提出連接請求時,Server端窗會收到WinsockStack送來我們自定義的一個消息,這時,我們可以分析lParam,然后調用相關的函數(shù)來處理此事件。為了使辦事器端接受客戶端的連接請求,就要使用accept()函數(shù),該函數(shù)新建一Socket與客戶端的Socket相通,原先監(jiān)聽之Socket繼續(xù)進入監(jiān)聽狀態(tài),等待他人的連接要求。該函數(shù)調用成功返回一個新產(chǎn)生的Socket對象,否則返回INVALID_SOCKET。SOCKETPASCALFARaccept(SCOKETs,structsockaddrFARaddr,intFARaddrlen);參數(shù):s:Socket的識別碼;addr:存放來連接的客戶端的地址;addrlen:addr的長度。6.結束socket連接結束辦事器和客戶端的通信連接是很簡單的,這一過程可以由辦事器或客戶機的任一端啟動,只要調用closesocket()就可以了,而要封鎖Server端監(jiān)聽狀態(tài)的socket,同樣也是利用此函數(shù)。另外,與軌范啟動時調用WSAStartup()憨數(shù)相對應,軌范結束前,需要調用WSACleanup()來通知WinsockDll釋放Socket所占用的資源。這兩個函數(shù)都是調用成功返回0,否則返回SOCKET_ERROR。intPASCALFARclosesocket(SOCKETs);參數(shù):s:Socket的識別碼;intPASCALFARWSACleanup(void);7.建立客戶端的Socket客戶端應用軌范首先也是調用WSAStartup()函數(shù)來與Winsock的動態(tài)連接庫建立關系,然后同樣調用socket()來建立一個TCP或UDPsocket(相同協(xié)定的sockets才能相通,TCP對TCP,UDP對UDP)。與辦事器端的socket分歧的是,客戶端的socket可以調用bind()函數(shù),由本身來指定IP地址及port號碼;但是也可以不調用bind(),而由Winsock來自動設定IP地址及port號碼。8.客戶端提出連接申請客戶端的Socket使用connect()函數(shù)來提出與辦事器端的Socket建立連接的申請,函數(shù)調用成功返回0,否則返回SOCKET_ERROR。intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù):s:Socket的識別碼;name:Socket想要連接的對方地址;namelen:name的長度。9.數(shù)據(jù)的傳送以包管資料的正確性,一般情況下TCPSocket的數(shù)據(jù)發(fā)送和接收是調用send()及recv()這兩個函數(shù)來達成,而UDPSocket則是用sendto()及recvfrom()這兩個函數(shù),這兩個函數(shù)調用成功發(fā)揮發(fā)送或接收的資料的長度,否則返回SOCKET_ERROR。intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);參數(shù):s:Socket的識別碼buf:存放要傳送的資料的暫存區(qū);lenbuf:的長度;flags:此函數(shù)被調用的方式。intPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);參數(shù):s:Socket的識別碼;buf:存放接收到的資料的暫存區(qū);lenbuf:的長度flags:此函數(shù)被調用的方式。對StreamSocket言,我們可以接收到目前inputbuffer內有效的資料,但其數(shù)量不超過len的大小。3.9套接字和客戶-辦事器通信統(tǒng)一資源定位符(URL)是在因特網(wǎng)上拜候站點和資源的一種重要機制。有時,你可能需要寫一個軌范來實現(xiàn)一臺客戶計算機和一臺辦事器計算機之間的低層通信。術語“客戶”和“辦事器”是指兩個互相通信的進程。其中一個進程(客戶)連接到另一個進程(辦事器)進行一次信息請求??蛻粜枰私廪k事器的地址,但在建立連接之前辦事器不必知道客戶的地址,甚至不必知道客戶的存在。一旦建立了連接,雙方即可以發(fā)送和接受信息。在客戶—辦事器環(huán)境中,每一端構建一個套接字來建立連接。一個套接字是進程間通信通道的一端,它和計算機上的一個特定的端口號相關聯(lián)以便TCP層可以確定數(shù)據(jù)是發(fā)送給哪個應用的。兩個進程都調用所在計算機操作系統(tǒng)軟件的子軌范,建立本身的套接字。在客戶機和辦事器上,套接字的建立有一些區(qū)別,說明如下:客戶:調用socket()子軌范,創(chuàng)建一個套接字。調用connect()子軌范,將該套接字連接到辦事器的地址。利用read()和write()子軌范發(fā)送和接收數(shù)據(jù)。辦事器:調用socket()子軌范,創(chuàng)建一個套接字。使用bind()子軌范將套接字和一個地址綁定(對于因特網(wǎng)上的一個辦事器套接字來說,地址包含主機計算機的一個端口號)。利用listen()子軌范監(jiān)聽連接請求。調用accept()子軌范接受一個連接。利用read()和write()子軌范發(fā)送和接收數(shù)據(jù)。在連接結束時,雙方封鎖連接,辦事器則繼續(xù)監(jiān)聽其他的連接。有兩種廣泛使用的套接字類型,流套接字和數(shù)據(jù)報套接字。流套接字使用TCP協(xié)議,并將通信視為一條連續(xù)的字符流,數(shù)據(jù)報套接字則采用UDP協(xié)議,必需一次讀入整個報文。4系統(tǒng)概要設計與實現(xiàn)這一部分主要介紹了C/S模式的通信過程,SOCKET建立連接的過程以及實現(xiàn)文件傳輸?shù)南嚓P流程。4.1通信過程C/S模式的請求響應方式TCP/IP協(xié)議三次握手過程在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接辦事,采用三次握手建立一個連接(如圖3.1)。第一次握手:建立連接時,客戶端發(fā)送syn包(syn=j)到辦事器,并進入SYN_SEND狀態(tài),等待辦事器確認;第二次握手:辦事器收到syn包,必需確認客戶的SYN(ack=j+1),同時本身也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時辦事器進入SYN_RECV狀態(tài);第三次握手:客戶端收到辦事器的SYN+ACK包,向辦事器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和辦事器進入ESTABLISHED狀態(tài),完成三次握手。完成三次握手,客戶端與辦事器開始傳送數(shù)據(jù)。4.2SOCKET建立連接過程辦事器創(chuàng)建套接字后,進行偵聽,客戶端創(chuàng)建套接字后進行連接,一旦建立連接,就可以發(fā)送接收數(shù)據(jù),直到封鎖套接字。服務器服務器 客戶端create(),建立套接字band(),與本地地址綁定listen(),準備好接受連接accept(),等待接受客戶端連接,receive()接收數(shù)據(jù)Close(),關閉套接字send(),發(fā)送數(shù)據(jù)Create(),建立套接字Connect(IP),與服務器連接receive()接收數(shù)據(jù)Close(),關閉套接字send()發(fā)送數(shù)據(jù)SOCKET建立連接過程4.3文件的傳輸4.3.1發(fā)送文件與接收文件流程4.3.2文件從辦事器傳輸?shù)娇蛻舳俗约褐袛嘧约褐袛喾掌骺蛻舳讼蚩蛻舳税l(fā)送傳輸文件請求,等待等待服務器的請求自己中斷開始傳輸文件進程進程開始傳輸文件進程進程SOCKET建立連接并傳輸文件SOCKET建立連接并傳輸文件過程中斷或對方的中斷過程中斷或對方的中斷傳輸完畢,結束進程傳輸完畢,結束進程關閉連接,返回關閉連接,返回對方拒絕對方拒絕傳輸文件過程首先辦事器向客戶端發(fā)送請求,要求傳送文件,在獲得客戶端相應之前,雙方都可以取消這次傳輸,同時通知對方已經(jīng)取消連接;一旦客戶端給了辦事器響應,則建立進程,進行傳輸;建立的進程里,要定義新的SOCKET套接字,以建立連接,在傳輸過程中,同樣可以進行間斷,同時通知對方已經(jīng)取消連接;傳輸結束后,斷開連接,結束該進程。5系統(tǒng)功能的演示這一部分主要給出了辦事器和客戶端的運行界面,以及演示了文件是怎樣從辦事器傳輸?shù)娇蛻舳说摹?.1辦事器和客戶端運行界面——辦事器端——客戶端5.2文件傳輸?shù)难菔臼紫刃陆▋蓚€文件夾,分別命名為“文件一”和“文件二”,在文件一中新建一個TXT格式的文本文檔,本系統(tǒng)將要演示的是把文件一中的新建文本文檔傳輸?shù)轿募?,傳輸步驟如下:1.在辦事器端添加文件,選擇文件一中的新建文本文檔,然后確認選擇2.在客戶端界面點擊接收按鈕,即可接收接新建文本文檔的路徑信息3.在客戶端界面中雙擊新建文本文檔,選擇文件二為保留的路徑,新建文本文檔即傳輸?shù)轿募邢嚓P界面如下:——添加文件一中的新建文本文檔到辦事器中

——添加成功后的界面——在客戶端界面點擊接收按鈕——將新建文本文檔保留到文件二,再重新保留一次,證明前面一次已經(jīng)將新建文本文檔傳輸?shù)轿募?總結與展望這一部分主要總結了多線程網(wǎng)絡文件傳輸系統(tǒng)的相關功能以及對本系統(tǒng)提出了一些需要研究加以改善的地方。6.1本文完成的主要工作在老師指導和同學輔助下,我基本上完成了多線程網(wǎng)絡文件傳輸系統(tǒng)的設計,并實現(xiàn)了文件傳輸一般的功能。該網(wǎng)絡文件傳輸系統(tǒng)主要包孕兩個大的部分:辦事器端和客戶端,其中辦事器端開啟辦事,監(jiān)聽客戶端的連接,然后如果有客戶端開啟,建立了連接以后,就可以由辦事器端選擇文件來進行發(fā)送傳輸。文件只能從辦事器傳遞給客戶端,采用的是TCP協(xié)議,客戶端必需和辦事器端先連接。同時系統(tǒng)采用了多線程技術,可以對較大文件進行分割傳送,同時可以開啟多個客戶端,并同時接收辦事器傳送的文件,且傳輸速率也比力高。6.2未來研究展望首先對系統(tǒng)提出一些改善的地方如下:1.本系統(tǒng)只能實現(xiàn)從辦事器到客戶端的單向傳輸,下一步要實現(xiàn)辦事器和客戶端間的彼此傳輸,辦事器可以當成客戶端,客戶端也可以成為辦事器2.本系統(tǒng)沒有客戶端與辦事器間的彼此交流,未來可以增加它們彼此交流的一個模塊3.本軟件在網(wǎng)絡傳輸上的體現(xiàn)只是在局域網(wǎng)中進行傳輸,未來可以進一步研究,實現(xiàn)文件在互聯(lián)網(wǎng)上的傳輸接下來是關于多線程網(wǎng)絡文件傳輸系統(tǒng)未來的發(fā)展趨勢:多線程網(wǎng)絡文件傳輸系統(tǒng)未來發(fā)展趨勢是提高可靠性和高效性,因為隨著網(wǎng)絡技術的不斷發(fā)展,無論是事業(yè)單位還是各類企業(yè)都在大力推進辦公自動化的進程,人們迫切需要一種能夠更好地滿足日常辦公需求的文件傳輸辦理系統(tǒng)。未來的發(fā)展趨勢是將多線程技術、斷點續(xù)傳技術應用于網(wǎng)絡文件傳輸系統(tǒng)中,實現(xiàn)文件傳輸進度顯示、開機自動重傳和文件校驗等功能,不僅能提高文件傳輸?shù)目煽啃院透咝?,也能讓用戶的使用更加簡單便當。致謝這次畢業(yè)設計開發(fā)過程中,獲得了很多同學跟老師的輔助,分外感謝感動他們的無私奉獻,同學間的彼此交流,老師的細心指導促成了這次畢業(yè)設計的完成,心里分外愉快。在這里分外要感謝感動我的導師。我的導師干事分外細心負責,從一開始選題,到開題敷陳,到中期檢查,到后期檢查,每個階段都分外關心我們的進展,本著認真負責的態(tài)度給我們分析,講解,改正。同時導師淵博的知識,使我受益匪淺,每次遇到無法解決的問題時,都能在老師那獲得滿意的答案。由衷的感謝感動我的導師的耐心指導!在開發(fā)過程中,同樣獲得了不少同學們的鼓勵和輔助,我的作品得以完成離不開你們的關心和支持,感謝感動你們。老師和同學們的指導和輔助,給了我很大的鼓舞,使我在遇到艱巨時不至于止步不前,而是迎風破浪,克服難題。從老師和同學們的建議中獲得了寶貴的學習和人生經(jīng)驗,這將對我以后的道路有莫大的輔助。感謝感動你們!參考文獻[1]孫鐘秀,費翔林,駱斌等.操作系統(tǒng)教程[M].北京:高檔教育出版社,2008:110.[2]嚴蔚敏,吳偉民等.操作系統(tǒng)[M].北京:清華大學出版社,2007:38-88.[3]湯子瀛,梁紅兵等.計算機操作系統(tǒng)[M].西安:西安電子科技大學出版社,,2003:56-78.[4]譚浩強等.C++面向對象軌范設計[M].北京:清華大學出版社,,2006:59-125.[5]BICLF,SHAWAC.操作系統(tǒng)原理[M].梁洪亮,等譯.北京:機械工業(yè)出版社,,2005:65[6]謝希仁等.計算機網(wǎng)絡(第5版)[M].北京:電子工業(yè)出版社,2007:25-30[7]楊金生.計算機網(wǎng)絡實驗指導[M].上海:上海交通大學出版社,2005:20-26.[8]史蒂文斯.TCP/IP詳解卷1:協(xié)議[M].北京:機械工業(yè)出版社,2000:99.[9]王力.VisualC++6.0MFC類庫參考手冊[M].北京:人民郵電出版社,2021:286[10](美)SteveHeller著,胡鳳燕譯.C++編程基礎:標準庫編程[M].北京:電子工業(yè)出版社,2021:110-120.[11]尹立民.VisualC++6.0應用編程150例[M].北京:電子工業(yè)出版社,2021:125.[12](美)Schildt,H。著,周志榮等譯.C++參考大全[M].北京:電子工業(yè)出版社,2021:58.[13]DouglasE.ComputerNetworksandInternets[M].北京:清華大學出版社,2006:289.[14]馬隣.Winsock2網(wǎng)絡編程實用教程[M].北京:清華大學出版社,2021:156-186.[15]王炎平.Windows網(wǎng)絡與通信軌范設計[M].北京:人民郵電出版社,2006:256.[16]趙景波.C++Builder6.0基礎教程[M].北京:機械工業(yè)出版社,2021:289-300.[17]陳燦煌.C++Builder6徹底研究[M].北京:中國鐵道出版社,2021:145-160.[18](美)W.RichardStevens.TCP/IP詳解.卷1協(xié)議(影印版)[M].北京:機械工業(yè)出版社,2005:189-198.[19]科默.用TCP/IP進行網(wǎng)際互連(第一卷):原理、協(xié)議與結構[M].北京:電子工業(yè)出版社,2007:156-182.[20]Tanenbaum.ComputerNetworks,AndrewS[M].北京:清華大學出版社,2008:25.附錄:核心代碼:辦事器端voidCTCPServer_FT::ListenRequest(){ m_bEndListenThread=FALSE;//開始監(jiān)聽 DWORDid; HANDLEh=CreateThread(NULL,0,ThreadListen,this,0,&id);//創(chuàng)建句柄 //線程要執(zhí)行的函數(shù)為ThreadListen,將this指針傳遞給線程,線程ID為id,創(chuàng)建成功,返回新線程的一個句柄 CloseHandle(h);//封鎖句柄,并不終止線程}//功能:停止監(jiān)聽//參數(shù):無//返回:無voidCTCPServer_FT::StopListen(){ m_bEndListenThread=TRUE;}//功能:監(jiān)聽線程//參數(shù):LPVOIDlpParam//返回:無意義DWORDWINAPICTCPServer_FT::ThreadListen(LPVOIDlpParam){ CTCPServer_FT*pServer=(CTCPServer_FT*)lpParam; SOCKETsockListen=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建socket //地址家族為internet,用于TCP和UDP,字節(jié)流,特定的協(xié)議 SOCKADDR_INsin;//轉換地址 sin.sin_family=AF_INET; sin.sin_addr.s_addr=0;//ip地址,以網(wǎng)路字節(jié)按次。 sin.sin_port=htons(pServer->m_iListenPort); //端口號,從主機字節(jié)按次轉化成網(wǎng)絡字節(jié)按次 if(bind(sockListen,(SOCKADDR*)&sin,sizeof(sin))==SOCKET_ERROR) {//若將socket與本地地址綁定失敗 closesocket(sockListen);//封鎖socket pServer->m_pWnd->SendMessage(WM_BINDERROR);//顯示錯誤 return1; } if(listen(sockListen,5)==SOCKET_ERROR) {//若將socket置于監(jiān)聽失敗 closesocket(sockListen); pServer->m_pWnd->SendMessage(WM_LISTENERROR); return1; } //開始監(jiān)聽 pServer->m_pWnd->SendMessage(WM_STARTLISTEN); fd_setfdListen;//結構體,將socket放進一個集合 timevalseltime;//結構體,指按時間值(秒+毫秒) seltime.tv_sec=0;//秒 seltime.tv_usec=10000;//毫秒==10秒 while(!pServer->m_bEndListenThread) {//辦事器在監(jiān)聽狀態(tài) FD_ZERO(&fdListen);//將集合清零 FD_SET(sockListen,&fdListen);//將socket添加到set中 if(select(0,&fdListen,NULL,NULL,&seltime)<=0||!FD_ISSET(sockListen,&fdListen)) continue; //如果在規(guī)按時間內,set中無socket可讀出||socket不在set中,結束本次循環(huán),繼續(xù)下次循環(huán) intlen=sizeof(sin); SOCKETsock=accept(sockListen,(SOCKADDR*)&sin,&len); //接受socket上的連接 PARAMRECV*pParamRecv=newPARAMRECV;//結構體,接收線程參數(shù) pParamRecv->sock=sock; pParamRecv->ptr=pServer; DWORDid; HANDLEh=CreateThread(NULL,0,ThreadRecv,pParamRecv,0,&id); //創(chuàng)建ThreadRecv線程,將pParamRecv傳遞給線程 CloseHandle(h); } closesocket(sockListen); return0;}//功能:接收線程//參數(shù):LPVOIDlpParam//返回:無意義DWORDWINAPICTCPServer_FT::ThreadRecv(LPVOIDlpParam){ PARAMRECV*pParam=(PARAMRECV*)lpParam;//指向接收線程的指針 CTCPServer_FT*pServer=(CTCPServer_FT*)pParam->ptr;//指向Server的指針 fd_setfdRecv;//結構體,接收線程集合 timevalseltime;//結構體,指按時間值==10s seltime.tv_sec=0; seltime.tv_usec=10000; while(1) { FD_ZERO(&fdRecv);//集合清零 FD_SET(pParam->sock,&fdRecv);//將已連接的socket加入集合 if(select(0,&fdRecv,NULL,NULL,&seltime)<=0||!FD_ISS

溫馨提示

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

評論

0/150

提交評論