Linux下基于socket的文件傳輸程序設計-課程設計_第1頁
Linux下基于socket的文件傳輸程序設計-課程設計_第2頁
Linux下基于socket的文件傳輸程序設計-課程設計_第3頁
Linux下基于socket的文件傳輸程序設計-課程設計_第4頁
Linux下基于socket的文件傳輸程序設計-課程設計_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、課程設計報告課程設計題目:Linux下基于socket的文件傳輸程序設計 學 院: 信 專業班級: 1 年 級: 大 姓 名: 學 號: 2 完成時間: 201 年 1 月 2 日成 績: 指導教師: 課程設計指導教師評定成績表項目分值優秀(100>x90)良好(90>x80)中等(80>x70)及格(70>x60)不及格(x<60)評分參考標準參考標準參考標準參考標準參考標準學習態度15學習態度認真,科學作風嚴謹,嚴格保證設計時間并按任務書中規定的進度開展各項工作學習態度比較認真,科學作風良好,能按期圓滿完成任務書規定的任務學習態度尚好,遵守組織紀律,基本保證設

2、計時間,按期完成各項工作學習態度尚可,能遵守組織紀律,能按期完成任務學習馬虎,紀律渙散,工作作風不嚴謹,不能保證設計時間和進度技術水平與實際能力25設計合理、理論分析與計算正確,實驗數據準確,有很強的實際動手能力、經濟分析能力和計算機應用能力,文獻查閱能力強、引用合理、調查調研非常合理、可信設計合理、理論分析與計算正確,實驗數據比較準確,有較強的實際動手能力、經濟分析能力和計算機應用能力,文獻引用、調查調研比較合理、可信設計合理,理論分析與計算基本正確,實驗數據比較準確,有一定的實際動手能力,主要文獻引用、調查調研比較可信設計基本合理,理論分析與計算無大錯,實驗數據無大錯設計不合理,理論分析與

3、計算有原則錯誤,實驗數據不可靠,實際動手能力差,文獻引用、調查調研有較大的問題創新10有重大改進或獨特見解,有一定實用價值有較大改進或新穎的見解,實用性尚可有一定改進或新的見解有一定見解觀念陳舊論文(計算書、圖紙)撰寫質量50結構嚴謹,邏輯性強,層次清晰,語言準確,文字流暢,完全符合規范化要求,書寫工整或用計算機打印成文;圖紙非常工整、清晰結構合理,符合邏輯,文章層次分明,語言準確,文字流暢,符合規范化要求,書寫工整或用計算機打印成文;圖紙工整、清晰結構合理,層次較為分明,文理通順,基本達到規范化要求,書寫比較工整;圖紙比較工整、清晰結構基本合理,邏輯基本清楚,文字尚通順,勉強達到規范化要求;

4、圖紙比較工整內容空泛,結構混亂,文字表達不清,錯別字較多,達不到規范化要求;圖紙不工整或不清晰指導教師評定成績:指導教師簽名: 年 月 日課程設計指導教師評定成績表項目分值優秀(100>x90)良好(90>x80)中等(80>x70)及格(70>x60)不及格(x<60)評分參考標準參考標準參考標準參考標準參考標準學習態度15學習態度認真,科學作風嚴謹,嚴格保證設計時間并按任務書中規定的進度開展各項工作學習態度比較認真,科學作風良好,能按期圓滿完成任務書規定的任務學習態度尚好,遵守組織紀律,基本保證設計時間,按期完成各項工作學習態度尚可,能遵守組織紀律,能按期完成

5、任務學習馬虎,紀律渙散,工作作風不嚴謹,不能保證設計時間和進度技術水平與實際能力25設計合理、理論分析與計算正確,實驗數據準確,有很強的實際動手能力、經濟分析能力和計算機應用能力,文獻查閱能力強、引用合理、調查調研非常合理、可信設計合理、理論分析與計算正確,實驗數據比較準確,有較強的實際動手能力、經濟分析能力和計算機應用能力,文獻引用、調查調研比較合理、可信設計合理,理論分析與計算基本正確,實驗數據比較準確,有一定的實際動手能力,主要文獻引用、調查調研比較可信設計基本合理,理論分析與計算無大錯,實驗數據無大錯設計不合理,理論分析與計算有原則錯誤,實驗數據不可靠,實際動手能力差,文獻引用、調查調

6、研有較大的問題創新10有重大改進或獨特見解,有一定實用價值有較大改進或新穎的見解,實用性尚可有一定改進或新的見解有一定見解觀念陳舊論文(計算書、圖紙)撰寫質量50結構嚴謹,邏輯性強,層次清晰,語言準確,文字流暢,完全符合規范化要求,書寫工整或用計算機打印成文;圖紙非常工整、清晰結構合理,符合邏輯,文章層次分明,語言準確,文字流暢,符合規范化要求,書寫工整或用計算機打印成文;圖紙工整、清晰結構合理,層次較為分明,文理通順,基本達到規范化要求,書寫比較工整;圖紙比較工整、清晰結構基本合理,邏輯基本清楚,文字尚通順,勉強達到規范化要求;圖紙比較工整內容空泛,結構混亂,文字表達不清,錯別字較多,達不到

7、規范化要求;圖紙不工整或不清晰指導教師評定成績:指導教師簽名: 年 月 日摘要線程(thread)技術早在60年代就被提出,但真正應用線程到操作系統中去,是在80年代中期。 為什么有了進程的概念后,還要再引入線程呢?使用多線程到底有哪些好處? 使用多線程的理由之一是和進程相比,它是一種非常"節儉"的多任務操作方式。在Linux系統下,啟動一個新的進程必須分配獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段。而運行于一個進程中的多個線程,它們之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于進程所花費的空間,而且,線程間彼此切換所需的時間

8、也遠遠小于進程間所需要的時間。使用多線程的理由之二是線程間方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式費時且很不方便。由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其它線程所用,這樣快且方便。在計算機中,凡是提供服務的一方我們稱為服務端(Server),而接受服務的另一方我們稱作客戶端(Client)。不過客戶端及伺服端的關系不見得一定建立在兩臺分開的機器上,提供服務的伺服端及接受服務的客戶端也有可能都在同一臺機器上,這樣在同一臺機器上就同時扮演伺服端及客戶端。線程間方便的通信機制可以使得在我們在服務端和客戶端方便

9、的進行通信傳輸與各種操作,可以通過運用多線程機制方便實現上傳、下載文件;增加、刪除用戶;以及在服務端進行文件的管理。關鍵字:多線程、socket通信、服務器和客戶端·1需求分析這次課程設計的要求是在以Linux為內核的操作系統下,實現多線程文件傳輸系統功能模塊。系統模塊分為服務器和客戶端兩部分,客戶端實現對文件的上傳、下載和查看服務器默認路徑下的文件列表;服務器可以對文件進行管理操作,包括創建、刪除和重命名等。多線程文件傳輸是一種一對多或者多對多的關系,一般是一個服務器對應著多個客戶端。客戶端通過socket連接服務器,服務器要為客戶端創建一個單獨進程(線程)監聽每個客戶端的請求。創

10、建好連接之后文件就可以通過流的形式傳輸。linux內核中為我們提供了兩種不同形式的讀寫流,包括read()、write()和send()、recv()。客戶機對文件的查看指令也是通過流傳遞給服務器,服務器根據請求類型返回不同相應流。根據socket原理和特點繪畫出鏈接流程圖,將客戶機與服務器的相互通信劃分為不同的模塊,每個模塊負責獨立的功能項。服務器輸入指令管理目錄下的文件,create filename是創建文件命令,rename oldname newname是刪除文命令,delete filename 是刪除文件命令,同時監聽著客戶端的請求;客戶端向服務器發送上傳、下載和查看請求,從而得

11、到不同的相應,包括將文件下載到當前路徑下,從當前路徑下上傳文件給服務器,列出服務器的文件列表。·2 socket通信原理國際標準化組織(ISO)在1978年提出開放系統互連參考模型(OSI:open system interconnection reference mode),該模型是設計和描述網絡通信的基本框架。OSI采用分層的額結構化技術將通信網絡分為7層,從低到高為物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。TCP/IP參考模型是由美國國防部創建,且發展至今最成功的通信協議模型,與OSI模型對應,它將網絡功能分為4層,包括網絡接口層、網絡層、傳輸層和應用層,每一

12、層都有對應的協議。在傳輸層的主要協議是TCP協議和UDP協議。socket連接就是基于TCP協議。TCP是一種可靠地數據傳輸協議。socket是一種套接口,它把網絡地址和端口號信息放在一個結構體中,也就是套接字地址結構。結構圖如下:套接口與ip、端口號的關系套接口22999922 9999Ip地址端口號通用套接口地址數據結構定義在<sys/socket.h>頭文件中,形式如下:struct sockaddruint8_t sa_len;sa_family_t sa_family;char sa_data14;IPv4套接口地址數據

13、結構以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套接口通信工作流程圖: 結束連接通知應答信號服務請求三次握手過程掛起,直到有客戶機的連接請求Socket()客戶機進程服務器進程Bind()Listen()Accept()Recv()Send()Connect()Send()Rec

14、v()Close()Socket()Recv()TCP 套接口通信工作過程通信工作的大致流程:1) 服務器先用socket()函數來建立一個套接口,用這個套接口完成通信的監聽及數據的收發。2) 服務器用bind()函數來綁定一個端口號和ip地址,是套接口與指定的端口號和ip關聯。3) 服務器調用linsten()函數,是服務器的端口和Ip處于監聽狀態,等待網絡中某一個客戶機的連接請求。4) 客戶機用socket()函數建立一個套接口,設定遠程ip和端口5) 客戶機調用connect()函數連接遠程計算機指定的端口。6) 服務器調用accept()函數來接受遠程計算機的連接請求,建立起與客戶機之

15、間的通信連接。7) 建立連接之后,客戶機用write()函數(或send())想socket中寫入數據。也可以用read()函數(或recv()函數)賭氣服務器發送來的數據。8) 服務器用read()函數(或recv()函數)來讀取客戶機發來的數據,也可以用write()函數(或send()函數)來發送數據。9) 完成通信以后,使用close()函數關閉socket連接。·3詳細設計過程·3.1服務器端創建監聽與文件管理服務器負責的功能模塊主要有兩部分,一是對連接進來客戶端所有線程的管理和服務器目錄下的文件管理;二是創建線程來單獨監聽客戶端的動作。為了便于管理,我們創建兩個

16、user.txt和client.txt兩個文檔來分別負責服務器的連接和客戶端的連接。user.txt中存放了服務器名和密碼。client.txt存放了連接客戶端名字和密碼。我們首先對服務器的創建有個監測,即在啟動時先核實服務器的所有者username和密碼password,將輸入的用戶、密碼與user.txt中的用戶密碼比較,匹配成功則同意啟動,否則return -1表失敗。接著創建一個socket套接口,綁定Ip設置客戶端的最大連接數為10,然后創建一個sever線程來實現對服務器本身監聽動作。主體代碼見最后 接下來創建線程完成對客戶端的監聽監聽等待連接:while(1)sockdata =

17、 accept(sockfd,(struct sockaddr*)0,(int*)0);.我們定義結構體:struct client_tpthread_t tid;int conn_fd;int used;char name20;p_client10;來存放每個客戶端的socket信息、線程標識、使用號、連接號和客戶名。創建線程實現單獨監聽: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()的功能監聽客戶端的功能完成。·3.2客戶端連接與文件傳輸在客戶端這邊我們同樣適用了檢測機制,運行客戶機時要將用戶名、密碼以及ip地址和端口號作為參數輸進來,先建立與服務器的連接,然后將用戶名和密碼發送到服務端檢測,如果檢測失敗則接收到一條拒絕信息,連接斷開,如果檢測成功則接收到一條確認信息,雙方通信開始。主體代碼見最后:·4結果演示創建,改名,與刪除客服端響應并連接服務器上傳下載具體代碼如下:服務器:#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; /目錄環境 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);/獲取文件描述信息 /將文件信息存放到鏈表中 /產生臨時節點 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); /將臨時節點插入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; /數組索引 int i=0,j=0; /如果head為空,直接返回 fileList * headArray1024; if(head = NULL) return ; /輸出當前目錄 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) /判斷是否為文件,是文件顯示文件 /若為目錄,將目錄名放入隊列,求隊列目錄 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; /頭節點初始化 headArrayi = getFileList(temp->file.fullName); /頭節點名稱 strcpy(headArrayi->file.fullName,temp->file.fullName); i+; temp=temp->nextfile; fclose(file); /對目錄隊列中目錄使用遞歸,直到結束 f

29、or(j=0;j<i;j+) showAllNode(headArrayj); return ;/showList/輸入:列表頭/輸出:顯示列表,返回voidvoid showList(fileList * head) /判斷head 是否為空,若為空直接返回 if(head = NULL)return; /若不為空則顯示它的內容 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);/還可以顯示此時的文件目錄信息,檢查是否完成了上傳 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:你暫時不能登錄服務器server,請稍后再登錄.n");exit(1);elsewhile(key=0)mems

溫馨提示

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

評論

0/150

提交評論