




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)題目:Linux下基于socket的文件傳輸程序設(shè)計(jì) 學(xué) 院: 信 專業(yè)班級(jí): 1 年 級(jí): 大 姓 名: 學(xué) 號(hào): 2 完成時(shí)間: 201 年 1 月 2 日成 績: 指導(dǎo)教師: 課程設(shè)計(jì)指導(dǎo)教師評(píng)定成績表項(xiàng)目分值優(yōu)秀(100>x90)良好(90>x80)中等(80>x70)及格(70>x60)不及格(x<60)評(píng)分參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)學(xué)習(xí)態(tài)度15學(xué)習(xí)態(tài)度認(rèn)真,科學(xué)作風(fēng)嚴(yán)謹(jǐn),嚴(yán)格保證設(shè)計(jì)時(shí)間并按任務(wù)書中規(guī)定的進(jìn)度開展各項(xiàng)工作學(xué)習(xí)態(tài)度比較認(rèn)真,科學(xué)作風(fēng)良好,能按期圓滿完成任務(wù)書規(guī)定的任務(wù)學(xué)習(xí)態(tài)度尚好,遵守組織紀(jì)律,基本保證設(shè)
2、計(jì)時(shí)間,按期完成各項(xiàng)工作學(xué)習(xí)態(tài)度尚可,能遵守組織紀(jì)律,能按期完成任務(wù)學(xué)習(xí)馬虎,紀(jì)律渙散,工作作風(fēng)不嚴(yán)謹(jǐn),不能保證設(shè)計(jì)時(shí)間和進(jìn)度技術(shù)水平與實(shí)際能力25設(shè)計(jì)合理、理論分析與計(jì)算正確,實(shí)驗(yàn)數(shù)據(jù)準(zhǔn)確,有很強(qiáng)的實(shí)際動(dòng)手能力、經(jīng)濟(jì)分析能力和計(jì)算機(jī)應(yīng)用能力,文獻(xiàn)查閱能力強(qiáng)、引用合理、調(diào)查調(diào)研非常合理、可信設(shè)計(jì)合理、理論分析與計(jì)算正確,實(shí)驗(yàn)數(shù)據(jù)比較準(zhǔn)確,有較強(qiáng)的實(shí)際動(dòng)手能力、經(jīng)濟(jì)分析能力和計(jì)算機(jī)應(yīng)用能力,文獻(xiàn)引用、調(diào)查調(diào)研比較合理、可信設(shè)計(jì)合理,理論分析與計(jì)算基本正確,實(shí)驗(yàn)數(shù)據(jù)比較準(zhǔn)確,有一定的實(shí)際動(dòng)手能力,主要文獻(xiàn)引用、調(diào)查調(diào)研比較可信設(shè)計(jì)基本合理,理論分析與計(jì)算無大錯(cuò),實(shí)驗(yàn)數(shù)據(jù)無大錯(cuò)設(shè)計(jì)不合理,理論分析與
3、計(jì)算有原則錯(cuò)誤,實(shí)驗(yàn)數(shù)據(jù)不可靠,實(shí)際動(dòng)手能力差,文獻(xiàn)引用、調(diào)查調(diào)研有較大的問題創(chuàng)新10有重大改進(jìn)或獨(dú)特見解,有一定實(shí)用價(jià)值有較大改進(jìn)或新穎的見解,實(shí)用性尚可有一定改進(jìn)或新的見解有一定見解觀念陳舊論文(計(jì)算書、圖紙)撰寫質(zhì)量50結(jié)構(gòu)嚴(yán)謹(jǐn),邏輯性強(qiáng),層次清晰,語言準(zhǔn)確,文字流暢,完全符合規(guī)范化要求,書寫工整或用計(jì)算機(jī)打印成文;圖紙非常工整、清晰結(jié)構(gòu)合理,符合邏輯,文章層次分明,語言準(zhǔn)確,文字流暢,符合規(guī)范化要求,書寫工整或用計(jì)算機(jī)打印成文;圖紙工整、清晰結(jié)構(gòu)合理,層次較為分明,文理通順,基本達(dá)到規(guī)范化要求,書寫比較工整;圖紙比較工整、清晰結(jié)構(gòu)基本合理,邏輯基本清楚,文字尚通順,勉強(qiáng)達(dá)到規(guī)范化要求;
4、圖紙比較工整內(nèi)容空泛,結(jié)構(gòu)混亂,文字表達(dá)不清,錯(cuò)別字較多,達(dá)不到規(guī)范化要求;圖紙不工整或不清晰指導(dǎo)教師評(píng)定成績:指導(dǎo)教師簽名: 年 月 日課程設(shè)計(jì)指導(dǎo)教師評(píng)定成績表項(xiàng)目分值優(yōu)秀(100>x90)良好(90>x80)中等(80>x70)及格(70>x60)不及格(x<60)評(píng)分參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)參考標(biāo)準(zhǔn)學(xué)習(xí)態(tài)度15學(xué)習(xí)態(tài)度認(rèn)真,科學(xué)作風(fēng)嚴(yán)謹(jǐn),嚴(yán)格保證設(shè)計(jì)時(shí)間并按任務(wù)書中規(guī)定的進(jìn)度開展各項(xiàng)工作學(xué)習(xí)態(tài)度比較認(rèn)真,科學(xué)作風(fēng)良好,能按期圓滿完成任務(wù)書規(guī)定的任務(wù)學(xué)習(xí)態(tài)度尚好,遵守組織紀(jì)律,基本保證設(shè)計(jì)時(shí)間,按期完成各項(xiàng)工作學(xué)習(xí)態(tài)度尚可,能遵守組織紀(jì)律,能按期完成
5、任務(wù)學(xué)習(xí)馬虎,紀(jì)律渙散,工作作風(fēng)不嚴(yán)謹(jǐn),不能保證設(shè)計(jì)時(shí)間和進(jìn)度技術(shù)水平與實(shí)際能力25設(shè)計(jì)合理、理論分析與計(jì)算正確,實(shí)驗(yàn)數(shù)據(jù)準(zhǔn)確,有很強(qiáng)的實(shí)際動(dòng)手能力、經(jīng)濟(jì)分析能力和計(jì)算機(jī)應(yīng)用能力,文獻(xiàn)查閱能力強(qiáng)、引用合理、調(diào)查調(diào)研非常合理、可信設(shè)計(jì)合理、理論分析與計(jì)算正確,實(shí)驗(yàn)數(shù)據(jù)比較準(zhǔn)確,有較強(qiáng)的實(shí)際動(dòng)手能力、經(jīng)濟(jì)分析能力和計(jì)算機(jī)應(yīng)用能力,文獻(xiàn)引用、調(diào)查調(diào)研比較合理、可信設(shè)計(jì)合理,理論分析與計(jì)算基本正確,實(shí)驗(yàn)數(shù)據(jù)比較準(zhǔn)確,有一定的實(shí)際動(dòng)手能力,主要文獻(xiàn)引用、調(diào)查調(diào)研比較可信設(shè)計(jì)基本合理,理論分析與計(jì)算無大錯(cuò),實(shí)驗(yàn)數(shù)據(jù)無大錯(cuò)設(shè)計(jì)不合理,理論分析與計(jì)算有原則錯(cuò)誤,實(shí)驗(yàn)數(shù)據(jù)不可靠,實(shí)際動(dòng)手能力差,文獻(xiàn)引用、調(diào)查調(diào)
6、研有較大的問題創(chuàng)新10有重大改進(jìn)或獨(dú)特見解,有一定實(shí)用價(jià)值有較大改進(jìn)或新穎的見解,實(shí)用性尚可有一定改進(jìn)或新的見解有一定見解觀念陳舊論文(計(jì)算書、圖紙)撰寫質(zhì)量50結(jié)構(gòu)嚴(yán)謹(jǐn),邏輯性強(qiáng),層次清晰,語言準(zhǔn)確,文字流暢,完全符合規(guī)范化要求,書寫工整或用計(jì)算機(jī)打印成文;圖紙非常工整、清晰結(jié)構(gòu)合理,符合邏輯,文章層次分明,語言準(zhǔn)確,文字流暢,符合規(guī)范化要求,書寫工整或用計(jì)算機(jī)打印成文;圖紙工整、清晰結(jié)構(gòu)合理,層次較為分明,文理通順,基本達(dá)到規(guī)范化要求,書寫比較工整;圖紙比較工整、清晰結(jié)構(gòu)基本合理,邏輯基本清楚,文字尚通順,勉強(qiáng)達(dá)到規(guī)范化要求;圖紙比較工整內(nèi)容空泛,結(jié)構(gòu)混亂,文字表達(dá)不清,錯(cuò)別字較多,達(dá)不到
7、規(guī)范化要求;圖紙不工整或不清晰指導(dǎo)教師評(píng)定成績:指導(dǎo)教師簽名: 年 月 日摘要線程(thread)技術(shù)早在60年代就被提出,但真正應(yīng)用線程到操作系統(tǒng)中去,是在80年代中期。 為什么有了進(jìn)程的概念后,還要再引入線程呢?使用多線程到底有哪些好處? 使用多線程的理由之一是和進(jìn)程相比,它是一種非常"節(jié)儉"的多任務(wù)操作方式。在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段。而運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程,它們之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于進(jìn)程所花費(fèi)的空間,而且,線程間彼此切換所需的時(shí)間
8、也遠(yuǎn)遠(yuǎn)小于進(jìn)程間所需要的時(shí)間。使用多線程的理由之二是線程間方便的通信機(jī)制。對(duì)不同進(jìn)程來說,它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式費(fèi)時(shí)且很不方便。由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這樣快且方便。在計(jì)算機(jī)中,凡是提供服務(wù)的一方我們稱為服務(wù)端(Server),而接受服務(wù)的另一方我們稱作客戶端(Client)。不過客戶端及伺服端的關(guān)系不見得一定建立在兩臺(tái)分開的機(jī)器上,提供服務(wù)的伺服端及接受服務(wù)的客戶端也有可能都在同一臺(tái)機(jī)器上,這樣在同一臺(tái)機(jī)器上就同時(shí)扮演伺服端及客戶端。線程間方便的通信機(jī)制可以使得在我們?cè)诜?wù)端和客戶端方便
9、的進(jìn)行通信傳輸與各種操作,可以通過運(yùn)用多線程機(jī)制方便實(shí)現(xiàn)上傳、下載文件;增加、刪除用戶;以及在服務(wù)端進(jìn)行文件的管理。關(guān)鍵字:多線程、socket通信、服務(wù)器和客戶端·1需求分析這次課程設(shè)計(jì)的要求是在以Linux為內(nèi)核的操作系統(tǒng)下,實(shí)現(xiàn)多線程文件傳輸系統(tǒng)功能模塊。系統(tǒng)模塊分為服務(wù)器和客戶端兩部分,客戶端實(shí)現(xiàn)對(duì)文件的上傳、下載和查看服務(wù)器默認(rèn)路徑下的文件列表;服務(wù)器可以對(duì)文件進(jìn)行管理操作,包括創(chuàng)建、刪除和重命名等。多線程文件傳輸是一種一對(duì)多或者多對(duì)多的關(guān)系,一般是一個(gè)服務(wù)器對(duì)應(yīng)著多個(gè)客戶端。客戶端通過socket連接服務(wù)器,服務(wù)器要為客戶端創(chuàng)建一個(gè)單獨(dú)進(jìn)程(線程)監(jiān)聽每個(gè)客戶端的請(qǐng)求。創(chuàng)
10、建好連接之后文件就可以通過流的形式傳輸。linux內(nèi)核中為我們提供了兩種不同形式的讀寫流,包括read()、write()和send()、recv()??蛻魴C(jī)對(duì)文件的查看指令也是通過流傳遞給服務(wù)器,服務(wù)器根據(jù)請(qǐng)求類型返回不同相應(yīng)流。根據(jù)socket原理和特點(diǎn)繪畫出鏈接流程圖,將客戶機(jī)與服務(wù)器的相互通信劃分為不同的模塊,每個(gè)模塊負(fù)責(zé)獨(dú)立的功能項(xiàng)。服務(wù)器輸入指令管理目錄下的文件,create filename是創(chuàng)建文件命令,rename oldname newname是刪除文命令,delete filename 是刪除文件命令,同時(shí)監(jiān)聽著客戶端的請(qǐng)求;客戶端向服務(wù)器發(fā)送上傳、下載和查看請(qǐng)求,從而得
11、到不同的相應(yīng),包括將文件下載到當(dāng)前路徑下,從當(dāng)前路徑下上傳文件給服務(wù)器,列出服務(wù)器的文件列表。·2 socket通信原理國際標(biāo)準(zhǔn)化組織(ISO)在1978年提出開放系統(tǒng)互連參考模型(OSI:open system interconnection reference mode),該模型是設(shè)計(jì)和描述網(wǎng)絡(luò)通信的基本框架。OSI采用分層的額結(jié)構(gòu)化技術(shù)將通信網(wǎng)絡(luò)分為7層,從低到高為物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層。TCP/IP參考模型是由美國國防部創(chuàng)建,且發(fā)展至今最成功的通信協(xié)議模型,與OSI模型對(duì)應(yīng),它將網(wǎng)絡(luò)功能分為4層,包括網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層,每一
12、層都有對(duì)應(yīng)的協(xié)議。在傳輸層的主要協(xié)議是TCP協(xié)議和UDP協(xié)議。socket連接就是基于TCP協(xié)議。TCP是一種可靠地?cái)?shù)據(jù)傳輸協(xié)議。socket是一種套接口,它把網(wǎng)絡(luò)地址和端口號(hào)信息放在一個(gè)結(jié)構(gòu)體中,也就是套接字地址結(jié)構(gòu)。結(jié)構(gòu)圖如下:套接口與ip、端口號(hào)的關(guān)系套接口22999922 9999Ip地址端口號(hào)通用套接口地址數(shù)據(jù)結(jié)構(gòu)定義在<sys/socket.h>頭文件中,形式如下:struct sockaddruint8_t sa_len;sa_family_t sa_family;char sa_data14;IPv4套接口地址數(shù)據(jù)
13、結(jié)構(gòu)以socketaddr_in命名,定義在<netinet/in.h>頭文件中,形式如下:struct socketaddr_inunit8_t sin_len;sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;unsigned char sin_zero8;下圖是TCP套接口通信工作流程圖: 結(jié)束連接通知應(yīng)答信號(hào)服務(wù)請(qǐng)求三次握手過程掛起,直到有客戶機(jī)的連接請(qǐng)求Socket()客戶機(jī)進(jìn)程服務(wù)器進(jìn)程Bind()Listen()Accept()Recv()Send()Connect()Send()Rec
14、v()Close()Socket()Recv()TCP 套接口通信工作過程通信工作的大致流程:1) 服務(wù)器先用socket()函數(shù)來建立一個(gè)套接口,用這個(gè)套接口完成通信的監(jiān)聽及數(shù)據(jù)的收發(fā)。2) 服務(wù)器用bind()函數(shù)來綁定一個(gè)端口號(hào)和ip地址,是套接口與指定的端口號(hào)和ip關(guān)聯(lián)。3) 服務(wù)器調(diào)用linsten()函數(shù),是服務(wù)器的端口和Ip處于監(jiān)聽狀態(tài),等待網(wǎng)絡(luò)中某一個(gè)客戶機(jī)的連接請(qǐng)求。4) 客戶機(jī)用socket()函數(shù)建立一個(gè)套接口,設(shè)定遠(yuǎn)程ip和端口5) 客戶機(jī)調(diào)用connect()函數(shù)連接遠(yuǎn)程計(jì)算機(jī)指定的端口。6) 服務(wù)器調(diào)用accept()函數(shù)來接受遠(yuǎn)程計(jì)算機(jī)的連接請(qǐng)求,建立起與客戶機(jī)之
15、間的通信連接。7) 建立連接之后,客戶機(jī)用write()函數(shù)(或send())想socket中寫入數(shù)據(jù)。也可以用read()函數(shù)(或recv()函數(shù))賭氣服務(wù)器發(fā)送來的數(shù)據(jù)。8) 服務(wù)器用read()函數(shù)(或recv()函數(shù))來讀取客戶機(jī)發(fā)來的數(shù)據(jù),也可以用write()函數(shù)(或send()函數(shù))來發(fā)送數(shù)據(jù)。9) 完成通信以后,使用close()函數(shù)關(guān)閉socket連接。·3詳細(xì)設(shè)計(jì)過程·3.1服務(wù)器端創(chuàng)建監(jiān)聽與文件管理服務(wù)器負(fù)責(zé)的功能模塊主要有兩部分,一是對(duì)連接進(jìn)來客戶端所有線程的管理和服務(wù)器目錄下的文件管理;二是創(chuàng)建線程來單獨(dú)監(jiān)聽客戶端的動(dòng)作。為了便于管理,我們創(chuàng)建兩個(gè)
16、user.txt和client.txt兩個(gè)文檔來分別負(fù)責(zé)服務(wù)器的連接和客戶端的連接。user.txt中存放了服務(wù)器名和密碼。client.txt存放了連接客戶端名字和密碼。我們首先對(duì)服務(wù)器的創(chuàng)建有個(gè)監(jiān)測(cè),即在啟動(dòng)時(shí)先核實(shí)服務(wù)器的所有者username和密碼password,將輸入的用戶、密碼與user.txt中的用戶密碼比較,匹配成功則同意啟動(dòng),否則return -1表失敗。接著創(chuàng)建一個(gè)socket套接口,綁定Ip設(shè)置客戶端的最大連接數(shù)為10,然后創(chuàng)建一個(gè)sever線程來實(shí)現(xiàn)對(duì)服務(wù)器本身監(jiān)聽動(dòng)作。主體代碼見最后 接下來創(chuàng)建線程完成對(duì)客戶端的監(jiān)聽監(jiān)聽等待連接:while(1)sockdata =
17、 accept(sockfd,(struct sockaddr*)0,(int*)0);.我們定義結(jié)構(gòu)體:struct client_tpthread_t tid;int conn_fd;int used;char name20;p_client10;來存放每個(gè)客戶端的socket信息、線程標(biāo)識(shí)、使用號(hào)、連接號(hào)和客戶名。創(chuàng)建線程實(shí)現(xiàn)單獨(dú)監(jiān)聽:p_clienti.conn_fd = sockdata;p_clienti.used = i;strcpy(p_ , client_name);pthread_create(&p_clienti.tid,NULL,&
18、;client_conn,&p_clienti)接下來是線程client_conn()的功能監(jiān)聽客戶端的功能完成。·3.2客戶端連接與文件傳輸在客戶端這邊我們同樣適用了檢測(cè)機(jī)制,運(yùn)行客戶機(jī)時(shí)要將用戶名、密碼以及ip地址和端口號(hào)作為參數(shù)輸進(jìn)來,先建立與服務(wù)器的連接,然后將用戶名和密碼發(fā)送到服務(wù)端檢測(cè),如果檢測(cè)失敗則接收到一條拒絕信息,連接斷開,如果檢測(cè)成功則接收到一條確認(rèn)信息,雙方通信開始。主體代碼見最后:·4結(jié)果演示創(chuàng)建,改名,與刪除客服端響應(yīng)并連接服務(wù)器上傳下載具體代碼如下:服務(wù)器:#include<stdio.h>#include<unistd
19、.h>#include<stdlib.h>#include<string.h>#include<sys/socket.h>#include<sys/stat.h>#include<arpa/inet.h>#include <sys/resource.h>#include <sys/types.h>#include <dirent.h>#define MAXBUF 256/*-start of fileList functions-*/int fileSize(char fileName);/文
20、件信息typedef struct fileinfo char name256; char fullName1024; int size; time_t mod_time; char type10;fileinfo;/文件列表typedef struct filelist fileinfo file; struct filelist* nextfile;fileList;/function getfilelist/輸入目錄名/輸出目錄下的文件列表頭指針fileList * getFileList(char name1024) fileList *head=NULL; fileList *cur
21、=NULL; char name_temp1024; /目錄 DIR * dir; /目錄環(huán)境 struct dirent *dir_env; /文件描述 struct stat stat_file; /初始化head head =(fileList*)malloc(sizeof(fileList); head->nextfile = NULL; /打開目錄 dir=opendir(name); while(dir_env=readdir(dir)/讀文件描述表 /排除.和. if(strcmp(dir_env->d_name,".")=0 | strcmp(d
22、ir_env->d_name,".")=0) continue; /把文件全名保存到新變量 strcpy(name_temp,name); strcat(name_temp,dir_env->d_name); stat(name_temp,&stat_file);/獲取文件描述信息 /將文件信息存放到鏈表中 /產(chǎn)生臨時(shí)節(jié)點(diǎn) cur=(fileList*)malloc(sizeof(fileList); /cur賦值 /文件名,fullName=cur_dir+"name" strcpy(cur->,dir_en
23、v->d_name); strcpy(cur->file.fullName,name_temp); /文件大小 /文件類型 if( S_ISDIR(stat_file.st_mode) cur->file.size = 0; strcpy(cur->file.type,"mulu"); strcat(cur->file.fullName,"/"); else cur->file.size = stat_file.st_size; strcpy(cur->file.type,"file"); /
24、修改日期 cur->file.mod_time = ctime(&stat_file.st_mtime); /將臨時(shí)節(jié)點(diǎn)插入head中 if(head->nextfile =NULL) head->nextfile = cur; cur->nextfile = NULL; else cur->nextfile = head->nextfile; head->nextfile = cur; return head;/showAllNode/輸入:目錄/輸出:次目錄下所有的文件,和所有目錄之下的文件void showAllNode(fileList
25、 *head) fileList * temp; /數(shù)組索引 int i=0,j=0; /如果head為空,直接返回 fileList * headArray1024; if(head = NULL) return ; /輸出當(dāng)前目錄 printf("%s ",head->file.fullName); printf("n"); /輸出head中的文件 temp =head->nextfile; char fileListStringMAXBUF;FILE *file;char _temp30;strcpy(_temp,"temp.
26、txt");file=fopen(_temp,"w");if(file=NULL)printf("The file is created failed!");exit(1); while(temp) /判斷是否為文件,是文件顯示文件 /若為目錄,將目錄名放入隊(duì)列,求隊(duì)列目錄 if (strcmp(temp->file.type,"file")=0) bzero(fileListString,MAXBUF); printf("file:%s ",temp->file.fullName); str
27、cat(fileListString,temp->file.fullName); strcat(fileListString,"n"); while (strlen(fileListString) > 0) int write_length = fwrite(fileListString, sizeof(char), strlen(fileListString), file);if (write_length < strlen(fileListString) printf("File Write into Failedn"); brea
28、k;bzero(fileListString, MAXBUF); else if(i>=1024) printf("there are too many direcotryn"); return; /頭節(jié)點(diǎn)初始化 headArrayi = getFileList(temp->file.fullName); /頭節(jié)點(diǎn)名稱 strcpy(headArrayi->file.fullName,temp->file.fullName); i+; temp=temp->nextfile; fclose(file); /對(duì)目錄隊(duì)列中目錄使用遞歸,直到結(jié)束 f
29、or(j=0;j<i;j+) showAllNode(headArrayj); return ;/showList/輸入:列表頭/輸出:顯示列表,返回voidvoid showList(fileList * head) /判斷head 是否為空,若為空直接返回 if(head = NULL)return; /若不為空則顯示它的內(nèi)容 while(head) printf("%sn",head->file.fullName); head = head->nextfile; return ;/*-end of fileList functions-*/void
30、main()int opt=1;while(opt!=0)printf("Please choose your choice bellow:n");printf("1:Manage the files.n");printf("2:Connect the clients.n");char window2;scanf("%s",window);if(strncmp(window,"1",1)=0)printf("Please input your choice bellow:n"
31、);printf("1: Create a new file.n");printf("2: Delete a file.n");printf("3: Rename a known file.n");char choice2;scanf("%s",choice);if(strncmp(choice,"1",1)=0)printf("Please input the new file name:");char filename20;scanf("%s",fil
32、ename);FILE *file;file=fopen(filename,"w");if(file=NULL)printf("The file created failed!n");elseprintf("The file has created successfully.n");continue;else if(strncmp(choice,"2",1)=0)printf("Please input the file name with the file path you want to delete
33、:n");char filename20;scanf("%s",filename);remove(filename);printf("The file has been deleted successfully.n");continue;elseprintf("Please input the file name you want to rename:n");char _old20;scanf("%s",_old);printf("Please input the new file name:n
34、");char _new20;scanf("%s",_new);int result = rename( _old, _new );if( result != 0 )printf( "Could not rename '%s'n", _old );else printf( "File '%s' renamed to '%s'n", _old, _new );continue;else int ssock; int clen; struct sockaddr_in client_
35、addr,server_addr; char bufMAXBUF; if(ssock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)<0) perror("socket error:"); exit(1); printf("Run the server successfully.nAnd now waiting the client comming.n"); memset(&server_addr,0,sizeof(server_addr); server_addr.sin_family=AF_INET; se
36、rver_addr.sin_addr.s_addr=inet_addr(""); server_addr.sin_port=htons(6669); if(bind(ssock,(struct sockaddr *)&server_addr,sizeof(server_addr)<0) perror("bind error:"); exit(1); int window=1; while(window!=0) clen=sizeof(client_addr); recvfrom(ssock,(void *)buf,MAXB
37、UF,0,(struct sockaddr*)&client_addr,&clen); printf("%sn",buf); if(strncmp(buf, "0", 1) = 0) if(strncmp(buf, "0yy", 7) = 0) strcpy(buf,"yes"); printf("It's username and right.n"); else strcpy(buf,"no");printf("It's usern
38、ame but wrong.n"); sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr ,sizeof(client_addr); else if(strncmp(buf, "1", 1) = 0) if(strncmp(buf, "1123", 4) = 0) strcpy(buf,"yes"); sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr ,
39、sizeof(client_addr); printf("It's password and right.n"); recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen); if(strncmp(buf, "upload", 5) = 0)printf("The client is going to upload file.n");recvfrom(ssock,(void *)buf,MAXBUF,0,(struct s
40、ockaddr*)&client_addr,&clen);/get filenameprintf("The filename of the file uploaded by user is:%sn",buf);FILE *file;char temp30;strcpy(temp,"recieve/");strcat(temp,buf);file=fopen(temp,"w");if(file=NULL)printf("The file is created failed!");exit(1);bze
41、ro(buf, MAXBUF);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen);while (strlen(buf) > 0)int write_length = fwrite(buf, sizeof(char), strlen(buf), file);if (write_length < strlen(buf) printf("File Write into Failedn"); break;bzero(buf, MAXBUF);fclose(f
42、ile);printf("Recieve file already success.n"); elseprintf("The client wants to download file.n");printf("Send the filelist to the client.n");/filelistfileList *mylist;/顯示的目錄char name1024="recieve/"/取得目錄下文件/頭指針傳遞的目錄或者文件名mylist =getFileList(name);strcpy(mylist-&
43、gt;file.fullName,name);/顯示目錄下文件/showList(mylist);/顯示目錄下所有文件showAllNode(mylist);/send fileListFILE *file;char temp30;strcpy(temp,"temp.txt");file=fopen(temp,"r");if(file=NULL)printf("The file cannot open!");exit(1);elseprintf("nThe fileListString open successfully!n
44、");bzero(buf,MAXBUF);int lengsize = 0;while(lengsize = fread(buf,1,MAXBUF,file) > 0)printf("lengsize = %dn",lengsize);sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,sizeof(server_addr);printf("%sn",buf);bzero(buf, MAXBUF);printf("The fileListStr
45、ing has been sent to the client already.n");fclose(file);bzero(buf, MAXBUF);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen);printf("The client choosen file: %sn",buf);strcpy(temp,"recieve/");strcat(temp,buf);file=fopen(temp,"r");if
46、(file=NULL)printf("The file is created failed!");exit(1);elseprintf("The file open successfully!n");printf("The file is downloading to the client now.n");bzero(buf,MAXBUF);int lengsize = 0;while(lengsize = fread(buf,1,MAXBUF,file) > 0)printf("lengsize = %dn"
47、;,lengsize);sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,sizeof(server_addr);bzero(buf, MAXBUF);printf("The file has been downloaded already.n");fclose(file);exit(1);/還可以顯示此時(shí)的文件目錄信息,檢查是否完成了上傳 close(ssock); window=0; else strcpy(buf,"no");sendto(ssock,(void
48、 *)buf,MAXBUF,0,(struct sockaddr*)&client_addr ,sizeof(client_addr);printf("It's password but wrong.n"); 客服端:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<strings.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h&g
49、t;#include<netinet/in.h>#include<netdb.h>#define PORT 6669#define MAXBUF 256int check_passwd(int sockfd);int tra_file(int sockfd);void main ( int argc, char *argv) char username20;char password20;char temp21;char window;printf("Please input your selections bellow:n");printf(&qu
50、ot;1:Login the server with your username and passwordn");printf("2:Registe a newly user now.n");printf("0:Exit the system.n");window=getchar();while(window>0)if(window='1')int key=0;printf("Please input your username:");scanf("%s",username);printf("%sn",username);int ssock;int clen;struct sockaddr_in client_addr,server_addr;char bufMAXBUF;if(ssock = socket(AF_INET,SOCK_DGRAM,0)<0)perror("socket error:你暫時(shí)不能登錄服務(wù)器server,請(qǐng)稍后再登錄.n");exit(1);elsewhile(key=0)mems
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全托管加盟合同樣本
- 住房防水協(xié)議合同樣本
- 保安勞務(wù)合同樣本封面
- 代理外包協(xié)議合同樣本
- 三天自動(dòng)解約合同范例
- 個(gè)人簡(jiǎn)易入股合同樣本
- pvc訂購合同樣本
- 雨棚成品購買合同范本
- 信息科技合同標(biāo)準(zhǔn)文本
- 臨街店鋪轉(zhuǎn)讓合同標(biāo)準(zhǔn)文本
- 醫(yī)院保安服務(wù)方案投標(biāo)文件(技術(shù)方案)
- 外研版高中英語新教材必修三Unit1隨身課本-Understandingideas01
- 口袋妖怪白金詳細(xì)圖文攻略(整理全)
- GB/T 9575-2013橡膠和塑料軟管軟管規(guī)格和最大最小內(nèi)徑及切割長度公差
- GB/T 6495.2-1996光伏器件第2部分:標(biāo)準(zhǔn)太陽電池的要求
- 2023年全國高考英語試題和答案(遼寧卷)
- 【精品】六年級(jí)下冊(cè)語文試題-閱讀理解專項(xiàng)訓(xùn)練5含答案全國通用
- 詳解2021年《關(guān)于優(yōu)化生育政策促進(jìn)人口長期均衡發(fā)展的決定》ppt
- 保護(hù)繼電器中文手冊(cè)-re610系列rem610tobcnb
- 焊接接頭表面質(zhì)量檢查記錄
- 空調(diào)機(jī)房吸音墻頂面綜合施工專題方案
評(píng)論
0/150
提交評(píng)論