計(jì)算機(jī)課程設(shè)計(jì)報(bào)告_第1頁(yè)
計(jì)算機(jī)課程設(shè)計(jì)報(bào)告_第2頁(yè)
計(jì)算機(jī)課程設(shè)計(jì)報(bào)告_第3頁(yè)
計(jì)算機(jī)課程設(shè)計(jì)報(bào)告_第4頁(yè)
計(jì)算機(jī)課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、下載可編輯.專業(yè).整理.課程設(shè)計(jì)課程名稱題目名稱學(xué)生學(xué)院專業(yè)班級(jí)學(xué) 號(hào)學(xué)生姓名指導(dǎo)教師200 年 月 日摘要本課程設(shè)計(jì)說(shuō)明書(shū)主要說(shuō)明了在 windows下如何用c語(yǔ)言編寫(xiě)設(shè)計(jì)ftp服務(wù)器和客戶端的基本方法及其實(shí)現(xiàn)。包含了 TCP/IP協(xié)議基本通信原理,Winsock編程基本原理以及ftp工作原 理。正文部分是程序設(shè)計(jì)的具體內(nèi)容及其源代碼,最后是報(bào)告反思及總結(jié)。關(guān)鍵詞:TCP/ipWinsock,ftp摘要1.緒論2設(shè)計(jì)目的2設(shè)計(jì)要求2計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境建立在TCP/IP網(wǎng)絡(luò)體系結(jié)構(gòu)之上。2具體要求 2設(shè)計(jì)準(zhǔn)備1設(shè)計(jì)方案.開(kāi)發(fā)環(huán)境介紹2.相關(guān)原理分析了解2TCP/IP 原理2網(wǎng)絡(luò)層協(xié)議2應(yīng)用層協(xié)

2、議23.2Winsock 編程原理 33.23Winsock編程模型:數(shù)據(jù)報(bào)套接字編程模型Winsock I/O 模型.43.3TP工作原理.43.4Winsock API基本函數(shù)介紹(1)WSAStartup ()函數(shù)和 WSACleanup ()函數(shù)(2)socket ()函數(shù)(3)bind()函數(shù)(4)listen()函數(shù).6(5)accept()函數(shù)(6)connect。函數(shù).6closesocket()函數(shù).64.總體設(shè)計(jì)7.4.1 了解Winsock與操作系統(tǒng)的關(guān)系4.2實(shí)現(xiàn)功能流程圖5.詳細(xì)設(shè)計(jì)5.1文件傳輸源程序代碼(1)客戶端client程序代碼(2)、服務(wù)器端server程

3、序代碼19六、系統(tǒng)實(shí)現(xiàn)步驟30七、總結(jié)結(jié)論(心得體會(huì))3233.緒 論設(shè)計(jì)目的本設(shè)計(jì)旨在利用原始socket簡(jiǎn)單實(shí)現(xiàn)FTP(File Transfer Protocol,文件傳輸協(xié)議)的客戶端和 服務(wù)器端程序,能夠?qū)崿F(xiàn)get、put、pwd、dir、cd等基本交互命令。通過(guò)完成此設(shè)計(jì),了解Winsock API函數(shù)調(diào)用方法和一般網(wǎng)絡(luò)應(yīng)用程序的編程方法,理解FTP協(xié)議,掌握C語(yǔ)言設(shè)計(jì)FTP協(xié)議軟件的基本技術(shù),為將來(lái)開(kāi)發(fā)其他通信協(xié)議軟件打下堅(jiān) 實(shí)基礎(chǔ)0設(shè)計(jì)要求計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境建立在TCP/IP網(wǎng)絡(luò)體系結(jié)構(gòu)之上。各計(jì)算機(jī)除了安裝 TCP/IP軟件外,還安裝了 TCP/IP開(kāi)發(fā)系統(tǒng)。實(shí)驗(yàn)室各計(jì)算機(jī)具

4、備 Windows環(huán)境中套接字socket的編程接口功能,可為用戶提供全網(wǎng)范圍的進(jìn)程通信功能。 本實(shí)驗(yàn)要求學(xué)生利用這些功能,設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件傳送協(xié)議。具體要求用socket編程接口編寫(xiě)兩個(gè)程序,分別為客戶程序(client.c)和服務(wù)器程序(server , 該程序應(yīng)能實(shí)現(xiàn)下述命令功能:get:取遠(yuǎn)方的一個(gè)文件put :傳給遠(yuǎn)方一個(gè)文件pwd :顯示遠(yuǎn)主當(dāng)前目錄dir:列出遠(yuǎn)方當(dāng)前目錄cd :改變遠(yuǎn)方當(dāng)前目錄?:顯示你提供的命令quit :退出返回計(jì)準(zhǔn)備裝有Windows操作系統(tǒng)的PC機(jī)、Visual C+ 6.0編譯器或VS2010編譯器計(jì)方案.服務(wù)器端調(diào)用socket的accept

5、 ()方法,等待客戶端聯(lián)接。.客戶端發(fā)送需要從服務(wù)端獲得的文件夾路徑給服務(wù)器端。.服務(wù)器端根據(jù)客戶端發(fā)來(lái)的路徑遍歷整個(gè)路徑下的文件及文件夾,并將需要傳送到文件記錄全路徑記錄到一個(gè)String類型的數(shù)組中,并將文件的個(gè)數(shù)發(fā)送給客戶端。.客戶端接收服務(wù)器端發(fā)來(lái)的文件個(gè)數(shù),并向服務(wù)器端發(fā)送關(guān)閉聯(lián)接請(qǐng)求,并關(guān)閉客戶 端連接。.服務(wù)器端收取關(guān)閉連接請(qǐng)求,將socket關(guān)閉,進(jìn)入傳輸文件循環(huán)中。.服務(wù)器端調(diào)用socket的accept ()方法,等待客戶端聯(lián)接。.客戶端根據(jù)剛才取得的要傳輸?shù)奈募?shù),進(jìn)行循環(huán)獲取文件,記得每次取完文件要關(guān) 閉socket連接,這樣就不會(huì)將多個(gè)文件寫(xiě)入到同一個(gè)文件中。.開(kāi)發(fā)環(huán)

6、境介紹VC6.0編程環(huán)境:首先建一個(gè)工程,填入文件名,點(diǎn)擊下一步,出現(xiàn)要?jiǎng)?chuàng)建的文件夾名 填上點(diǎn)擊下一步,完成建立工程。然后再點(diǎn)擊新建菜單,新建一個(gè)C/C+source文件,點(diǎn) 擊下一步,完成建立過(guò)程,然后在窗口中寫(xiě)入源代碼,執(zhí)行即可。.相關(guān)原理分析了解TCP/IP 原理TCP協(xié)議和IP協(xié)議指兩個(gè)用在Internet上的網(wǎng)絡(luò)協(xié)議(或數(shù)據(jù)傳輸?shù)姆椒ǎ?。它們分別 是傳輸控制協(xié)議和互連網(wǎng)協(xié)議。這兩個(gè)協(xié)議屬于眾多的TCP/IP協(xié)議組中的一部分。TCP/IP協(xié)議組中的協(xié)議保證Internet上數(shù)據(jù)的傳輸,提供了幾乎現(xiàn)在上網(wǎng)所用到的所有 服務(wù)。這些服務(wù)包括:電子郵件的傳輸,文件傳輸,新聞組的發(fā)布,訪問(wèn)萬(wàn)維網(wǎng)

7、在TCP/IP協(xié)議組分兩種協(xié)議:網(wǎng)絡(luò)層的協(xié)議和應(yīng)用層的協(xié)議網(wǎng)絡(luò)層協(xié)議:網(wǎng)絡(luò)層協(xié)議管理離散的計(jì)算機(jī)間的數(shù)據(jù)傳輸。這些協(xié)議用戶注意不到,是在系統(tǒng)表層以下工作的。比如,IP協(xié)議為用戶和遠(yuǎn)程計(jì)算機(jī)提供了信息包的傳輸 方法。它是在許多信息的基礎(chǔ)上工作的,比如說(shuō)是機(jī)器的IP地址。在機(jī)器IP地址和其它信 息的基礎(chǔ)上,IP確保信息包能正確地到達(dá)目的機(jī)器。通過(guò)這一過(guò)程,IP和其它網(wǎng)絡(luò)層的協(xié)議 共同用于數(shù)據(jù)傳輸。如果沒(méi)有網(wǎng)絡(luò)工具,用戶就看不到在系統(tǒng)里工作的IP。應(yīng)用層協(xié)議:相反地,應(yīng)用層協(xié)議用戶是可以看得到的。比如,文件傳輸協(xié)議(FTP)用戶是看得到的。 用戶為了傳輸一個(gè)文件請(qǐng)求一個(gè)和其它計(jì)算機(jī)的連接,連接建立后

8、,就開(kāi)始傳輸文件。在傳輸時(shí),用戶和遠(yuǎn)程計(jì)算機(jī)的交換的一部分是能看到的。TCP/IP通過(guò)使用協(xié)議棧工作。這個(gè)棧是所有用來(lái)在兩臺(tái)機(jī)器間完成一個(gè)傳輸?shù)乃袇f(xié)議 的幾個(gè)集合。(這也就是一個(gè)通路,數(shù)據(jù)通過(guò)它從一臺(tái)機(jī)器到另一臺(tái)機(jī)器。)棧分成層,與 這里有關(guān)的是五個(gè)層。棧的每一層都能從相鄰的層中接收或發(fā)送數(shù)據(jù)。每一層都與許多協(xié)議 相聯(lián)系。在棧的每一層,這些協(xié)議都在起作用。本章的下一部分將分析這些服務(wù),以及它們 在棧中是如何聯(lián)系的。同時(shí)也分析一下它們的功能,它們提供的服務(wù)和與安全性的關(guān)系。Winsock 編程原理通過(guò)Winsock可實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)或廣播通信程序,實(shí)際這兩者之間的區(qū)別不大,編程時(shí) 其程序流程所用代碼

9、幾乎相同,不同的地方在于目標(biāo)地址選擇的不同。由于Winsock的服務(wù)是以動(dòng)態(tài)鏈接庫(kù) Winsock DLL形式實(shí)現(xiàn)的,因此先調(diào)用1、WSAStartup 對(duì) Winsock DLL 進(jìn)行初始化2、應(yīng)用程序關(guān)閉套接字后,還應(yīng)調(diào)用 WSACleanup終止對(duì)Winsock DLL的使用3.23Winsock編程模型:流套接字編程模型:.服務(wù)器進(jìn)程創(chuàng)建套接字socket.將本地地址綁定到所創(chuàng)建的套接字bind.將套接字置入監(jiān)聽(tīng)模式并準(zhǔn)備接受連接請(qǐng)求listen , accept.客戶進(jìn)程調(diào)用socket函數(shù)創(chuàng)建客戶端套接字.客戶向服務(wù)進(jìn)程發(fā)出連接請(qǐng)求connect.當(dāng)服務(wù)器接收到客戶請(qǐng)求,阻塞的ac

10、cept進(jìn)程,生成新一個(gè)新的套接字與客戶套接字建立連接,并向客戶端返回接受信號(hào).客戶套接字收到服務(wù)器接受信號(hào),表示連接建立成功,開(kāi)始用 send, recv進(jìn)行收發(fā)數(shù)據(jù)8關(guān)閉套接字先用 shutdown 再用 closesocket數(shù)據(jù)報(bào)套接字編程模型:服務(wù)器用socket創(chuàng)建,用bind綁定用readfrom從網(wǎng)絡(luò)上接收,收不到進(jìn)入阻塞客戶端也用socket , bind綁定客戶端用sendto發(fā)送數(shù)據(jù)服務(wù)器端接收數(shù)據(jù),用sendto進(jìn)行響應(yīng)數(shù)據(jù)發(fā)送完兩者調(diào)用closesocket進(jìn)行套接字釋放Winsock I/O 模型:阻塞模式:一直等待下去,不會(huì)立即返回非阻塞模式:無(wú)論何都會(huì)返回關(guān)交出

11、程序的控制權(quán)3.3TP工作原理文件傳輸協(xié)議是從一個(gè)系統(tǒng)向另一個(gè)系統(tǒng)傳遞文件的標(biāo)準(zhǔn)方法。它的目標(biāo)在RFC 0765中寫(xiě)得很清楚。FTP的目標(biāo)1)促進(jìn)文件和程序的共享2)鼓勵(lì)間接和含蓄的使用遠(yuǎn)程計(jì)算機(jī)3)使用戶不必面對(duì)主機(jī)間使用的不同的文件存儲(chǔ)系統(tǒng)4)有效和可靠地傳輸文件。FTP,盡管用戶可以直接通過(guò)終端來(lái)使用,是設(shè)計(jì)成讓別的 程序使用的。FTP文件傳輸應(yīng)用在客戶/服務(wù)環(huán)境。請(qǐng)求機(jī)器啟動(dòng)一個(gè)FTP客戶端軟件。這就給目標(biāo)文 件服務(wù)器發(fā)出了一個(gè)請(qǐng)求。典型地,這個(gè)要求被送到端口 21。一個(gè)連接建立起來(lái)后,目標(biāo) 文件服務(wù)器必須運(yùn)行一個(gè) FTP服務(wù)軟件。FTPD是標(biāo)準(zhǔn)的FTP服務(wù)daemon。它的功能很簡(jiǎn)

12、單:回復(fù)inetd收到的連接請(qǐng)求,并滿足這些要傳輸文件的請(qǐng)求。這個(gè)daemon在許多發(fā)行 版的UNIX中是個(gè)標(biāo)準(zhǔn)。FTPD等待一個(gè)連接請(qǐng)求。當(dāng)這樣的一個(gè)請(qǐng)求到達(dá)時(shí),FTPD請(qǐng)求用 戶登錄。用戶提供它的合法的登錄名和口令或匿名登錄 。一旦登錄成功,用戶可以下載文件 了。在某些情況下,如果服務(wù)器的安全允許,用戶可以上載文件。3.4Winsock API 基本函數(shù)介紹WSAStartup ()函數(shù)和 WSACleanup ()函數(shù)由于 Winsock 2提供的API服務(wù)是以動(dòng)態(tài)鏈接庫(kù) ws2_32.dll實(shí)現(xiàn)的,所以必須先調(diào)用 WSAStartup()函數(shù)對(duì)ws2_32.dll進(jìn)行加載初始化,協(xié)商

13、Winsock的版本支持,并分配必要 的資源。在應(yīng)用程序關(guān)閉套接字后,還應(yīng)調(diào)用WSACleanup()函數(shù)來(lái)終止和卸載動(dòng)態(tài)鏈接庫(kù) ws2_32.dll ,釋放資源。socket ()函數(shù)服務(wù)進(jìn)程和客戶進(jìn)程在通信前必須創(chuàng)建各自的套接字,然后才能用相應(yīng)的套接字進(jìn)行發(fā) 送、接收操作,實(shí)現(xiàn)數(shù)據(jù)的傳輸。服務(wù)進(jìn)程總是先于客戶進(jìn)程啟動(dòng),服務(wù)進(jìn)程和客戶進(jìn)程調(diào) 用socket()函數(shù)創(chuàng)建套接字obind()函數(shù)當(dāng)用socket()創(chuàng)建套接字后,它便存在于一個(gè)名字空間(地址族)中,但并未賦名。bind ()函數(shù)通過(guò)給一個(gè)未命名套接字分配一個(gè)本地名字(主機(jī)地址/端口號(hào))來(lái)為套接字建立本地捆綁??蛻舳艘话汶[式地向操作

14、系統(tǒng)請(qǐng)求一個(gè)隨機(jī)的未使用過(guò)的臨時(shí)端口號(hào),跟自己的IP地址一起,與所創(chuàng)建的套接字建立聯(lián)系,由于該臨時(shí)端口號(hào)客戶端程序事先是不確定的, 因此不顯式地使用綁定函數(shù)。listen()函數(shù)調(diào)用listen()函數(shù)對(duì)服務(wù)器上套接字啟動(dòng)監(jiān)聽(tīng),即允許客戶連接請(qǐng)求開(kāi)始排隊(duì)。accept()函數(shù)服務(wù)器設(shè)置監(jiān)聽(tīng)工作方式后,通過(guò)調(diào)用accept()函數(shù)使套接字等待接受客戶連接。如 果已有連接請(qǐng)求到來(lái),該函數(shù)會(huì)返回一個(gè)新的套接字描述符,它對(duì)應(yīng)于已經(jīng)接受的那個(gè)客戶 端連接。對(duì)于該客戶機(jī)后續(xù)的所有操作,都應(yīng)使用這個(gè)新套接字。至于原來(lái)那個(gè)監(jiān)聽(tīng)套接字, 它仍然用于接受其他客戶機(jī)連接,繼續(xù)處于監(jiān)聽(tīng)模式。connect()函數(shù)客戶

15、端利用connect()函數(shù)和服務(wù)器建立一個(gè)端到端的連接。closesocket() 函數(shù)網(wǎng)絡(luò)通信任務(wù)完成后,利用本函數(shù)釋放套接字占用的所有資源。.總體設(shè)計(jì)了解Winsock與操作系統(tǒng)的關(guān)系I應(yīng)用程序I應(yīng)用程序2操件系統(tǒng)Windows動(dòng)態(tài)鏈:接庫(kù)網(wǎng)絡(luò)編程接口一Witisock APITCP/IP辦議棧網(wǎng)儀摳動(dòng)程序物應(yīng)施宿喬而實(shí)現(xiàn)功能流程圖.詳細(xì)設(shè)計(jì)文件傳輸源程序代碼(1)客戶端client程序代碼#include Winsock.h#include windows.h#include stdio.h#include time.h#include #define RECV_PORT 3312#d

16、efine SEND_PORT 4302#pragma comment(lib, wsock32.lib)SOCKET sockclient;char filename20;/文件名sockaddr_in ServerAddr;/ 服務(wù)器地址char rbuff1024;/接收緩沖區(qū)char sbuff1024;/發(fā)送緩沖區(qū)char InputIP20;/存儲(chǔ)輸入的服務(wù)器IPvoid help() /處理help命令cout歡迎進(jìn)入迷你FTP幫助菜單endl* * * * * * * * * * * * * * * * * * * *endll.get.下載(接受)文件endlget的用法:g

17、et文件名endlendl2.put.上彳(發(fā)送)文件endlput的用法:put文件名endl3.pwd. 顯示當(dāng)前文件夾的絕對(duì)路徑endl4.dir.顯示遠(yuǎn)方當(dāng)前目錄的文件endlendl5.cd.改變遠(yuǎn)方當(dāng)前目錄和路徑endlcd的用法(進(jìn)入下級(jí)目錄):cd路徑名endlcd的用法(進(jìn)入上級(jí)目錄):cd .endlendl6.?或者h(yuǎn)elp進(jìn)入幫助菜單endl7.quit退出 FTP endl*endl;/*dir:列出遠(yuǎn)方當(dāng)前目錄 */void list(SOCKET sockfd)int nRead;while(true)nRead=recv(sockclient,rbuff,102

18、4,0);/recv 函數(shù)通過(guò)sockclient套接口接受數(shù)據(jù)存入rbuff緩沖區(qū),返回接受到的字節(jié)數(shù)if(nRead=SOCKET_ERROR) printf(read response error!n);exit(1);if(nRead=0)/數(shù)據(jù)讀取結(jié)束break;/顯示數(shù)據(jù)rbuffnRead=0;printf(%s,rbuff); int SendFile(SOCKET datatcps,FILE* file)/*put傳給遠(yuǎn)方一個(gè)文件*/printf( sending file data.);for(;)/從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端int r=fread(sbuff,1,1

19、024,file);/fread函數(shù)從 file 文件讀取 1 個(gè) 1024 長(zhǎng)度的數(shù)據(jù)到sbuff ,返回成功讀取的元素個(gè)數(shù)if(send(datatcps,sbuff,r,0)=SOCKET_ERROR)printf(lost the connection to client!n);closesocket(datatcps);return 0;if(r1024)/文件傳送結(jié)束break;closesocket(datatcps);printf(donen);return 1;DWORD StartSock() / 啟動(dòng) winsock WSADATA WSAData;char a20;me

20、mset(a,0,20);if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/力口載 winsock 版本printf(sock init fail!n);return (-1); if(strncmp(InputIP ,a,20)=0) printf(請(qǐng)輸入連接的主機(jī)IP:);scanf(%s”,&InputIP);/設(shè)置地址結(jié)構(gòu)ServerAddr.sin_family=AF_INET;/AF_INET表示使用 IP 地址族ServerAddr.sin_addr.s_addr=inet_addr(InputIP);/指定服務(wù)器 IPServerAddr.si

21、n_port=htons(RECV_PORT);/設(shè)置端口號(hào)return(1);/創(chuàng)建套接字DWORD CreateSocket()sockclient=socket(AF_INET,SOCK_STREAM,0);/ 當(dāng) socket 函數(shù)成功調(diào)用時(shí)返回一個(gè)新的 SOCKET(Socket Descriptor) if(sockclient=SOCKET_ERROR) printf(sockclient create fail! n); WSACleanup(); return(-1); return(1); DWORD CallServer() / 發(fā)送連接請(qǐng)求 CreateSocket()

22、; if(connect(sockclient,(structsockaddr*)&ServerAddr,sizeof(ServerAddr)=SOCKET_ERROR) /connect函數(shù)創(chuàng)建與指定外部端口的連接 printf(Connect fail n); memset(InputIP ,0,20); return(-1);return(1);DWORD TCPSend(char data口)/發(fā)送命令int length;length=send(sockclient,data,strlen(data),0); /send 函數(shù)通過(guò)sockclient接口發(fā)送data里面的數(shù)據(jù),發(fā)送成

23、功返回發(fā)送的字節(jié)數(shù)if(length0)fwrite(rbuff,sizeof(rbuff),count,fd);/把count個(gè)數(shù)據(jù)長(zhǎng)度為size0f ()的數(shù)據(jù)從rbuff輸入到fd指向的目標(biāo)文件fclose(fd);/ 關(guān)閉文件if(strncmp(rbuff,put,3)=0)/putstrcpy(filename,rbuff+9);fd2=fopen(filename,rb);/rb讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,只允許讀寫(xiě)數(shù)據(jù)if(fd2)if(!SendFile(sockclient,fd2)printf(send failed!);return 0;fclose(fd2);/ 關(guān)閉文件

24、else/打開(kāi)文件失敗strcpy(sbuff,cant open file!n);if(send(sockclient,sbuff,1024,0)return 0;if(strncmp(rbuff,dir,3)=0)/dirprintf(n);list(sockclient);/列出接受到的列表內(nèi)容if(strncmp(rbuff,pwd,3)=0)list(sockclient);if(strncmp(rbuff,cd,2)=0) closesocket(sockclient);WSACleanup();return main();/列出接受到的內(nèi)容-絕對(duì)路徑/cd/關(guān)閉連接/ 釋放 Wi

25、nsock(2)、服務(wù)器端server程序代碼#include Winsock.h#include windows.h#include stdio.h#define RECV_PORT 3312#define SEND_PORT 4302#pragma comment(lib, wsock32.lib)SOCKET sockclient,sockserver;sockaddr_in ServerAddr;/服務(wù)器地址sockaddr_in ClientAddr;/客戶端地址/*全局變量*/int Addrlen;/地址長(zhǎng)度char filename20;/ 文件名char order10;/

26、命令char rbuff1024;/接收緩沖區(qū)char sbuff1024;/發(fā)送緩沖區(qū)DWORD StartSock() / 初始化 winsockWSADATA WSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) printf(socket init fail!n);return (-1);return(1);DWORD CreateSocket()sockclient=socket(AF_INET,SOCK_STREAM,0);if(sockclient=SOCKET_ERROR)printf(sockclient create fail

27、! n);WSACleanup();return(-1);ServerAddr.sin_family=AF_INET;ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);ServerAddr.sin_port=htons(RECV_PORT);if(bind(sockclient,(structsockaddrFAR*)&ServerAddr,sizeof(ServerAddr)=SOCKET_ERROR)/bind函數(shù)將套接字和地址結(jié)構(gòu)綁定printf(bind is the error);return(-1);return (1);int SendFi

28、leRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)/ 用來(lái)發(fā)送當(dāng)前文件記錄char filerecordMAX_PATH+32;FILETIME ft;/文件建立時(shí)間FileTimeToLocalFileTime(&pfd-ftLastWriteTime,&ft);SYSTEMTIME lastwtime;/SYSTEMTIME系統(tǒng)時(shí)間數(shù)據(jù)結(jié)構(gòu)FileTimeToSystemTime(&ft,&lastwtime);char *dir=pfd-dwFileAttributes&FILE_ATTR舊UTE_DIRECTORY?”:;sprintf(fil

29、erecord,%04d-%02d-%02d %02d:%02d%5s %10d%-20sn,lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd-nFileSizeLow,pfd-cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)=SOCKET_ERROR)/通過(guò)datatcps 接口發(fā)送filerecord 數(shù)據(jù),成功返回發(fā)送的字節(jié)數(shù)printf(Error occurs when sending

30、 file list!n);return 0;return 1;int SendFileList(SOCKET datatcps)HANDLE hff;/建立一個(gè)線程WIN32_FIND_DATA fd; / 搜索文件hff=FindFirstFile(*,&fd);/可以通過(guò)FindFirstFile ()函數(shù)根據(jù)當(dāng)前的文件存放路徑查找該文件來(lái)把待操作文件的相關(guān)屬性讀取到WIN32_FIND_DATA結(jié)構(gòu)中去:if(hff=INVALID_HANDLE_VALUE)/ 發(fā)生錯(cuò)誤 const char *errstr=cant list files!n;printf(list file err

31、or!n);if(send(datatcps,errstr,strlen(errstr),0)=SOCKET_ERROR) printf(error occurs when senging file list!n); closesocket(datatcps);return 0; BOOL fMoreFiles=TRUE;while(fMoreFiles)/發(fā)送此項(xiàng)文件信息if(!SendFileRecord(datatcps,&fd) closesocket(datatcps);return 0; /搜索下一個(gè)文件fMoreFiles=FindNextFile(hff,&fd);closes

32、ocket(datatcps);return 1; int SendFile(SOCKET datatcps,FILE* file) printf( sending file data.);for(;)/從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端int r=fread(sbuff,1,1024,file);/ 把 file 里面的內(nèi)容讀到sbuff 緩沖區(qū)if(send(datatcps,sbuff,r,0)=SOCKET_ERROR)printf(lost the connection to client!n);closesocket(datatcps);return 0; if(r1024)/文件傳

33、送結(jié)束break;closesocket(datatcps);printf(donen);return 1;/連接DWORD ConnectProcess()Addrlen=sizeof(sockaddr_in);if(listen(sockclient,5)0)printf(Listen error);return(-1);printf(服務(wù)器監(jiān)聽(tīng)中n);for(;)sockserver=accept(sockclient,(struct sockaddr FAR *)&ClientAddr,&Addrlen);/accept函數(shù)取出連接隊(duì)列的第一個(gè)連接請(qǐng)求,sockclient 是處于監(jiān)聽(tīng)

34、的套接字ClientAddr 是監(jiān)聽(tīng)的對(duì)象地址,/Addrlen是對(duì)象地址的長(zhǎng)度f(wàn)or(;)memset(rbuff,0,1024);memset(sbuff,0,1024);if(recv(sockserver,rbuff,1024,0)0)/recv函數(shù)返回接受的字節(jié)數(shù)賦給countfwrite(rbuff,sizeof(char),count,fd);/把count個(gè)數(shù)據(jù)長(zhǎng)度為size0f ()的數(shù)據(jù)從rbuff輸入到fd指向的目標(biāo)文件printf( get %s succed!n,filename);fclose(fd);/putif(strncmp(rbuff,pwd,3)=0)ch

35、ar path1000;GetCurrentDirectory(1000,path);/找到當(dāng)前進(jìn)程的當(dāng)前目錄strcpy(sbuff,path);send(sockserver,sbuff,1024,0);/pwdif(strncmp(rbuff,dir,3)=0)strcpy(sbuff,rbuff);send(sockserver,sbuff,1024,0);SendFileList(sockserver);/ 發(fā)送當(dāng)前列表/dirif(strncmp(rbuff,cd,2)=0) strcpy(filename,rbuff+3);strcpy(sbuff,rbuff);send(soc

36、kserver,sbuff,1024,0);SetCurrentDirectory(filename);/設(shè)置當(dāng)前目錄/cdclosesocket(sockserver);/for 2/for 1int main()if(StartSock()=-1)/初始化winsockreturn(-1);if(CreateSocket()=-1)/創(chuàng)建套接字,綁定等一系列操作return(-1);if(ConnectProcess()=-1)/建立連接,并進(jìn)行相應(yīng)的命令操作return(-1);return(1);六、系統(tǒng)實(shí)現(xiàn)步驟先在編譯器中運(yùn)行server.exe程序,然后服務(wù)器進(jìn)入監(jiān)聽(tīng)狀態(tài);然后再運(yùn)行client.exe程序,進(jìn)入連接server狀態(tài),輸入本機(jī)的IP地址,進(jìn)入連接交互界 面。 E;酶習(xí)+ 作嶇dient6 1Dcbugclicnt6 1+exe請(qǐng)輸入連接的服務(wù)器IP; 192, 16& L LS5請(qǐng)輸入命令(輸入?或help進(jìn)入幫助菜單):9歡迎

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論