Linux下基于socket的文件傳輸程序設(shè)計(jì)
《Linux下基于socket的文件傳輸程序設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《Linux下基于socket的文件傳輸程序設(shè)計(jì)(24頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 課 程 設(shè) 計(jì) 課程名稱(chēng)Linux下基于socket的文件傳輸程序設(shè)計(jì) 學(xué)生學(xué)院 信息工程學(xué)院 專(zhuān)業(yè)班級(jí) 學(xué) 號(hào) 學(xué)生姓名 指導(dǎo)教師 2013 年 12月 27日 引言 在互聯(lián)網(wǎng)已經(jīng)基本普及的情況下,人們?cè)絹?lái)越依賴于信息網(wǎng)絡(luò)。因?yàn)榛ヂ?lián)網(wǎng)的使用,我們可以大大的節(jié)省了我們的時(shí)間及成本。所以文件、信息的傳輸已經(jīng)是人們生活
2、中不可缺少的東西。而現(xiàn)在主流的應(yīng)用軟件都是基于WINDOWS平臺(tái)上開(kāi)發(fā)運(yùn)行的。 Linux操作系統(tǒng)本身具有非常高的安全性,不易感染病毒(這是WINDOWS系統(tǒng)所不能比擬的),而且可移植性強(qiáng),應(yīng)用于大多數(shù)的服務(wù)器。所以我們應(yīng)該多開(kāi)發(fā)出適合人們使用的應(yīng)用軟件,使得Linux更加好的為廣大網(wǎng)民使用以保障自身的安全性。 本課設(shè)主要介紹在Linux下的文件傳輸原理及功能,雖然不能與主流傳輸軟件的功能相比,但是卻是占用的資源比它要少 1課設(shè)背景分析 這次課程設(shè)計(jì)的要求是在以Linux為內(nèi)核的操作系統(tǒng)下,實(shí)現(xiàn)多線程文件傳輸系統(tǒng)功能模塊。系統(tǒng)模塊分為服務(wù)器和客戶端兩部分,客戶端實(shí)現(xiàn)對(duì)文件的上傳
3、、下載和查看服務(wù)器默認(rèn)路徑下的文件列表;服務(wù)器可以對(duì)文件進(jìn)行管理操作,包括創(chuàng)建、刪除和重命名等。 多線程文件傳輸是一種一對(duì)多或者多對(duì)多的關(guān)系,一般是一個(gè)服務(wù)器對(duì)應(yīng)著多個(gè)客戶端??蛻舳送ㄟ^(guò)socket連接服務(wù)器,服務(wù)器要為客戶端創(chuàng)建一個(gè)單獨(dú)進(jìn)程(線程)監(jiān)聽(tīng)每個(gè)客戶端的請(qǐng)求。 創(chuàng)建好連接之后文件就可以通過(guò)流的形式傳輸。linux內(nèi)核中為我們提供了兩種不同形式的讀寫(xiě)流,包括read()、write()和send()、recv()??蛻魴C(jī)對(duì)文件的查看指令也是通過(guò)流傳遞給服務(wù)器,服務(wù)器根據(jù)請(qǐng)求類(lèi)型返回不同相應(yīng)流。 根據(jù)socket原理和特點(diǎn)繪畫(huà)出鏈接流程圖,將客戶機(jī)與服務(wù)器的相互通信劃分為不同的
4、模塊,每個(gè)模塊負(fù)責(zé)獨(dú)立的功能項(xiàng)。服務(wù)器輸入指令管理目錄下的文件,create filename是創(chuàng)建文件命令,rename oldname newname是刪除文命令,delete filename 是刪除文件命令,同時(shí)監(jiān)聽(tīng)著客戶端的請(qǐng)求;客戶端向服務(wù)器發(fā)送上傳、下載和查看請(qǐng)求,從而得到不同的相應(yīng),包括將文件下載到當(dāng)前路徑下,從當(dāng)前路徑下上傳文件給服務(wù)器,列出服務(wù)器的文件列表。 2網(wǎng)絡(luò)通信原理及socket簡(jiǎn)介 2.1網(wǎng)絡(luò)通信原理(TCP) 國(guó)際標(biāo)準(zhǔn)化組織(ISO)在1978年提出開(kāi)放系統(tǒng)互連參考模型(OSI:open system interconnection refere
5、nce 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參考模型是由美國(guó)國(guó)防部創(chuàng)建,且發(fā)展至今最成功的通信協(xié)議模型,與OSI模型對(duì)應(yīng),它將網(wǎng)絡(luò)功能分為4層,包括網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層,每一層都有對(duì)應(yīng)的協(xié)議。在傳輸層的主要協(xié)議是TCP協(xié)議和UDP協(xié)議。 socket連接就是基于TCP協(xié)議。TCP是一種可靠地?cái)?shù)據(jù)傳輸協(xié)議。 它為應(yīng)用程序提供可靠的通信連接。適合于一次傳輸大批數(shù)據(jù)的情況。并適用于要求得到響應(yīng)的應(yīng)用程序并通過(guò)3次握手。
6、 其數(shù)據(jù)包頭格式為: 2.2 socket簡(jiǎn)介 在Linux中的網(wǎng)絡(luò)編程是通過(guò)socket接口來(lái)進(jìn)行的。socket是一種特殊的I/O接口,它也是一種文件描述符。它是一種常用的進(jìn)程之間通信機(jī)制,通過(guò)它不僅能實(shí)現(xiàn)本地機(jī)器上的進(jìn)程之間的通信,而且通過(guò)網(wǎng)絡(luò)能夠在不同機(jī)器上的進(jìn)程之間進(jìn)行通信。 每一個(gè)socket都用一個(gè)半相關(guān)描述{協(xié)議、本地地址、本地端口}來(lái)表示;一個(gè)完整的套接字則用一個(gè)相關(guān)描述{協(xié)議、本地地址、本地端口、遠(yuǎn)程地址、遠(yuǎn)程端口}來(lái)表示。socket也有一個(gè)類(lèi)似于打開(kāi)文件的函數(shù)調(diào)用,該函數(shù)返回一個(gè)整型的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸
7、等操作都是通過(guò)socket來(lái)實(shí)現(xiàn)的。
socket是一種套接口,它把網(wǎng)絡(luò)地址和端口號(hào)信息放在一個(gè)結(jié)構(gòu)體中,也就是套接字地址結(jié)構(gòu)。
結(jié)構(gòu)圖如下:
套接口與ip、端口號(hào)的關(guān)系
套接口
168.222.222.222
9999
222.222.222.222 9999
Ip地址
端口號(hào)
通用套接口地址數(shù)據(jù)結(jié)構(gòu)定義在
8、ta[14];
};
IPv4套接口地址數(shù)據(jù)結(jié)構(gòu)以socketaddr_in命名,定義在
9、Socket() 客戶機(jī)進(jìn)程 服務(wù)器進(jìn)程 Bind() Listen() Accept() Recv() Send() Connect() Send() Recv() Close() Socket() Recv() TCP 套接口通信工作過(guò)程 通信工作的大致流程: 1) 服務(wù)器先用socket()函數(shù)來(lái)建立一個(gè)套接口,用這個(gè)套接口完成通信的監(jiān)聽(tīng)及數(shù)據(jù)的收發(fā)。 2) 服務(wù)器用bind()函數(shù)來(lái)綁定一個(gè)端口號(hào)和ip地址,是套接口與指定的端口號(hào)和ip關(guān)聯(lián)。 3) 服務(wù)器調(diào)用linsten()函數(shù),是服務(wù)器的端口和Ip處于監(jiān)聽(tīng)狀態(tài),等待網(wǎng)絡(luò)中某一個(gè)客戶機(jī)的連接請(qǐng)
10、求。 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ù)來(lái)接受遠(yuǎn)程計(jì)算機(jī)的連接請(qǐng)求,建立起與客戶機(jī)之間的通信連接。 7) 建立連接之后,客戶機(jī)用write()函數(shù)(或send())想socket中寫(xiě)入數(shù)據(jù)。也可以用read()函數(shù)(或recv()函數(shù))賭氣服務(wù)器發(fā)送來(lái)的數(shù)據(jù)。 8) 服務(wù)器用read()函數(shù)(或recv()函數(shù))來(lái)讀取客戶機(jī)發(fā)來(lái)的數(shù)據(jù),也可以用write()函數(shù)(或send()函數(shù))來(lái)發(fā)送數(shù)據(jù)。 9) 完成通信以后,使用close()函數(shù)關(guān)閉so
11、cket連接。 3詳細(xì)設(shè)計(jì)過(guò)程 3.1服務(wù)器端創(chuàng)建監(jiān)聽(tīng)與文件管理 服務(wù)器負(fù)責(zé)的功能模塊主要有兩部分,一是對(duì)連接進(jìn)來(lái)客戶端所有線程的管理和服務(wù)器目錄下的文件管理;二是創(chuàng)建線程來(lái)單獨(dú)監(jiān)聽(tīng)客戶端的動(dòng)作。為了便于管理,我們創(chuàng)建兩個(gè)user.txt和client.txt兩個(gè)文檔來(lái)分別負(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),否則re
12、turn -1表失敗。 接著創(chuàng)建一個(gè)socket套接口,綁定Ip設(shè)置客戶端的最大連接數(shù)為10,然后創(chuàng)建一個(gè)sever線程來(lái)實(shí)現(xiàn)對(duì)服務(wù)器本身監(jiān)聽(tīng)動(dòng)作。主體代碼見(jiàn)最后 接下來(lái)創(chuàng)建線程完成對(duì)客戶端的監(jiān)聽(tīng) 監(jiān)聽(tīng)等待連接: while(1) { sockdata = accept(sockfd,(struct sockaddr*)0,(int*)0); ……………. 我們定義結(jié)構(gòu)體: struct client_t { pthread_t tid; int conn_fd; int used; char name[20]; }p_cli
13、ent[10]; 來(lái)存放每個(gè)客戶端的socket信息、線程標(biāo)識(shí)、使用號(hào)、連接號(hào)和客戶名。創(chuàng)建線程實(shí)現(xiàn)單獨(dú)監(jiān)聽(tīng): p_client[i].conn_fd = sockdata; p_client[i].used = i; strcpy(p_client[i].name , client_name); pthread_create(&p_client[i].tid,NULL,&client_conn,&p_client[i]) 接下來(lái)是線程client_conn()的功能 監(jiān)聽(tīng)客戶端的功能完成。 3.2客戶端連接與文件傳輸 在客戶端這邊我們同樣適
14、用了檢測(cè)機(jī)制,運(yùn)行客戶機(jī)時(shí)要將用戶名、密碼以及ip地址和端口號(hào)作為參數(shù)輸進(jìn)來(lái),先建立與服務(wù)器的連接,然后將用戶名和密碼發(fā)送到服務(wù)端檢測(cè),如果檢測(cè)失敗則接收到一條拒絕信息,連接斷開(kāi),如果檢測(cè)成功則接收到一條確認(rèn)信息,雙方通信開(kāi)始。
主體代碼見(jiàn)最后:
到此為止我們已經(jīng)實(shí)現(xiàn)了服務(wù)器和客戶端的主體功能,具體代碼查看附錄文件夾。
具體代碼如下:
服務(wù)端:
#include
15、e
16、 int size; time_t mod_time; char type[10]; }fileinfo; //文件列表 typedef struct filelist { fileinfo file; struct filelist* nextfile; }fileList; //function getfilelist //輸入目錄名 //輸出目錄下的文件列表頭指針 fileList * getFileList(char name[1024]) { fileList *head=NULL; fileL
17、ist *cur=NULL; char name_temp[1024]; //目錄 DIR * dir; //目錄環(huán)境 struct dirent *dir_env; //文件描述 struct stat stat_file; //初始化head head =(fileList*)malloc(sizeof(fileList)); head->nextfile = NULL; //打開(kāi)目錄 dir=opendir(name); while(dir_env=r
18、eaddir(dir))//讀文件描述表 { //排除.和.. if(strcmp(dir_env->d_name,".")==0 || strcmp(dir_env->d_name,"..")==0) continue; //把文件全名保存到新變量 strcpy(name_temp,name); strcat(name_temp,dir_env->d_name); stat(name_temp,&stat_file);//獲取文件描述信息
19、 //將文件信息存放到鏈表中 //產(chǎn)生臨時(shí)節(jié)點(diǎn) cur=(fileList*)malloc(sizeof(fileList)); //cur賦值 //文件名,fullName=cur_dir+"name"; strcpy(cur->file.name,dir_env->d_name); strcpy(cur->file.fullName,name_temp); //文件大小 //文件類(lèi)型 if( S_ISDIR(stat_
20、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"); } //修改日期
21、 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;
22、 } } return head; } //showAllNode //輸入:目錄 //輸出:次目錄下所有的文件,和所有目錄之下的文件 void showAllNode(fileList *head) { fileList * temp; //數(shù)組索引 int i=0,j=0; //如果head為空,直接返回 fileList * headArray[1024]; if(head == NULL) return ; //輸出當(dāng)前目錄 prin
23、tf("%s ",head->file.fullName); printf("\n"); //輸出head中的文件 temp =head->nextfile; char fileListString[MAXBUF]; FILE *file; char _temp[30]; strcpy(_temp,"temp.txt"); file=fopen(_temp,"w"); if(file==NULL){ printf("The file is created failed!"); exit(1); }
24、while(temp) { //判斷是否為文件,是文件顯示文件 //若為目錄,將目錄名放入隊(duì)列,求隊(duì)列目錄 if (strcmp(temp->file.type,"file")==0) { bzero(fileListString,MAXBUF); printf("file:%s ",temp->file.fullName); strcat(fileListString,temp->file.fullName); strcat(fileListStr
25、ing,"\n"); while ((strlen(fileListString)) > 0) { int write_length = fwrite(fileListString, sizeof(char), strlen(fileListString), file); if (write_length < strlen(fileListString)) { printf("File Write into Failed\n"); break; } bzero(fileListString, MAXBUF);
26、 } }else{ if(i>=1024) { printf("there are too many direcotry\n"); return; } //頭節(jié)點(diǎn)初始化 headArray[i] = getFileList(temp->file.fullName); //頭節(jié)點(diǎn)名稱(chēng) strcpy(headArray[i]-
27、>file.fullName,temp->file.fullName); i++; } temp=temp->nextfile; } fclose(file); //對(duì)目錄隊(duì)列中目錄使用遞歸,直到結(jié)束 for(j=0;j
28、 //判斷head 是否為空,若為空直接返回 if(head == NULL)return; //若不為空則顯示它的內(nèi)容 while(head) { printf("%s\n",head->file.fullName); head = head->nextfile; } return ; } /*----------end of fileList functions-----------*/ void main() { int opt=1; while(opt!=0){
29、 printf("Please choose your choice bellow:\n"); printf("1:Manage the files.\n"); printf("2:Connect the clients.\n"); char window[2]; scanf("%s",window); if((strncmp(window,"1",1))==0){ printf("Please input your choice bellow:\n"); printf("1: Create a new file.\n"); printf
30、("2: Delete a file.\n"); printf("3: Rename a known file.\n"); char choice[2]; scanf("%s",choice); if((strncmp(choice,"1",1))==0){ printf("Please input the new file name:"); char filename[20]; scanf("%s",filename); FILE *file; file=fopen(filename,"w"); if
31、(file==NULL){ printf("The file created failed!\n"); } else{ printf("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:\n"); char
32、filename[20]; scanf("%s",filename); remove(filename); printf("The file has been deleted successfully.\n"); continue; } else{ printf("Please input the file name you want to rename:\n"); char _old[20]; scanf("%s",_old); printf("Please input the new file
33、name:\n"); char _new[20]; 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
34、clen; struct sockaddr_in client_addr,server_addr; char buf[MAXBUF]; 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"); mem
35、set(&server_addr,0,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); server_addr.sin_port=htons(6669); if(bind(ssock,(struct sockaddr *)&server_addr,sizeof(server_addr))<0){ perror("bind error:"); exi
36、t(1); } int window=1; while(window!=0){ clen=sizeof(client_addr); recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen); printf("%s\n",buf); if((strncmp(buf, "0", 1)) == 0) { if((strncmp(buf, "0yy", 7)) == 0)
37、 { strcpy(buf,"yes"); printf("Its username and right.\n"); } else { strcpy(buf,"no"); printf("Its username but wrong.\n"); } sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr ,sizeof(client_addr));
38、 } 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 ,sizeof(client_addr)); printf("Its password and right.\n"); recvf
39、rom(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 sockaddr*)&client_addr,&clen);//get filename printf("The filename of
40、 the file uploaded by user is:%s\n",buf); FILE *file; char temp[30]; strcpy(temp,"recieve/"); strcat(temp,buf); file=fopen(temp,"w"); if(file==NULL){ printf("The file is created failed!"); exit(1); } bzero(buf, MAXBUF); r
41、ecvfrom(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 Failed\n");
42、 break; } bzero(buf, MAXBUF); } fclose(file); printf("Recieve file already success.\n"); } else{ printf("The client wants to download file.\n"); printf("Send the filelist to the client...\n"); //filelist fileL
43、ist *mylist; //顯示的目錄 char name[1024]="recieve/"; //取得目錄下文件 //頭指針傳遞的目錄或者文件名 mylist =getFileList(name); strcpy(mylist->file.fullName,name); //顯示目錄下文件 //showList(mylist); //顯示目錄下所有文件 showAllNode(mylist); //send fileList
44、 FILE *file; char temp[30]; strcpy(temp,"temp.txt"); file=fopen(temp,"r"); if(file==NULL){ printf("The file cannot open!"); exit(1); } else{ printf("\nThe fileListString open successfully!\n"); bzero(buf,MAXBUF); in
45、t lengsize = 0; while((lengsize = fread(buf,1,MAXBUF,file)) > 0) { printf("lengsize = %d\n",lengsize); sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,sizeof(server_addr)); printf("%s\n",buf); bzero(buf, MAXBUF); }
46、 printf("The fileListString 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: %s\n",buf); strcpy(temp,"r
47、ecieve/"); strcat(temp,buf); file=fopen(temp,"r"); if(file==NULL){ printf("The file is created failed!"); exit(1); } else{ printf("The file open successfully!\n"); printf("The file is downloading to the client now...\n");
48、bzero(buf,MAXBUF); int lengsize = 0; while((lengsize = fread(buf,1,MAXBUF,file)) > 0) { printf("lengsize = %d\n",lengsize); sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,sizeof(server_addr)); bzero(buf, MAXBUF);
49、 } printf("The file has been downloaded already.\n"); } fclose(file); exit(1);//還可以顯示此時(shí)的文件目錄信息,檢查是否完成了上傳 } close(ssock); window=0; } else { strcpy(buf,"no"); sendto(ssock,(void *)buf,MAXBUF,0
50、,(struct sockaddr*)&client_addr ,sizeof(client_addr));
printf("Its password but wrong.\n");
}
}
}
}
}
}
客服端:
#include 51、ys/socket.h>
#include 52、nput your selections bellow:\n");
printf("1:Login the server with your username and password\n");
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:");
sca 53、nf("%s",username);
printf("%s\n",username);
int ssock;
int clen;
struct sockaddr_in client_addr,server_addr;
char buf[MAXBUF];
if((ssock = socket(AF_INET,SOCK_DGRAM,0))<0){
perror("socket error:你暫時(shí)不能登錄服務(wù)器server,請(qǐng)稍后再登錄...\n");
exit(1);
}
else{
while 54、(key==0){
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
server_addr.sin_port=htons(PORT);
strcpy(temp,"0");
strcat(temp,username);
strcpy(buf,temp);
sendto(ssock 55、,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));
printf("你已經(jīng)發(fā)送username(%s)給server請(qǐng)等待響應(yīng)...\n",buf);
clen=sizeof(client_addr);
recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,&clen);
printf("你已經(jīng)得到了server的響應(yīng):%s\n",buf);
if((strn 56、cmp(buf, "yes", 3)) != 0)
{
printf("The username you inputed is wrong!\n");
window=1;
close(ssock);
printf("Please input your username:");
scanf("%s",username);
printf("%s\n",username);
}
else{
close(ssock);
key=1;
}
57、 }
}
printf("Please input your password:");
scanf("%s",password);
printf("%s\n",password);
if((ssock = socket(AF_INET,SOCK_DGRAM,0))<0){
perror("socket error:你暫時(shí)不能登錄服務(wù)器server,請(qǐng)稍后再登錄...\n");
exit(1);
}
else{
key=0;
while(key==0){
memset(&s 58、erver_addr,0,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
server_addr.sin_port=htons(PORT);
bzero(temp,21);
strcpy(temp,"1");
printf("%s\n",temp);
strcat(temp,password);
strcpy(buf,temp);
59、 sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));
printf("你已經(jīng)發(fā)送password(%s)給server請(qǐng)等待響應(yīng)...\n",buf);
clen=sizeof(client_addr);
recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,&clen);
printf("你已經(jīng)得到了server的響應(yīng):%s\n",buf 60、);
if((strncmp(buf, "yes", 3)) != 0)
{
printf("The password you inputed is wrong!\n");
window=1;
close(ssock);
printf("Please input your password:");
scanf("%s",password);
printf("%s\n",password);
}
else{
//file list display an 61、d file choose
printf("Please choose eithor upload file or download file bellow:\n");
printf("1:upload file.\n");
printf("2:download file.\n");
char choose[2];
scanf("%s",choose);
char path[20];
char filename[20];
if((strncmp(choose,"1",1))==0){ 62、
printf("please input the path you want to upload end with /:\n");
scanf("%s",path);
printf("Please input the file you want to upload:\n");
strcpy(buf,"upload");
sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));
sca 63、nf("%s",filename);
strcat(path,filename);
strcpy(buf,filename);
sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));
FILE *file;
file=fopen(path,"r");
if(file==NULL){
perror("The file open failed!");
64、exit(1);
}
else{
printf("The file open successfully!\n");
printf("The file is uploading now...\n");
bzero(buf,MAXBUF);
int lengsize = 0;
while((lengsize = fread(buf,1,MAXBUF,file)) > 0)
{
printf("lengsize = %d\n",lengsiz 65、e);
sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));
bzero(buf, MAXBUF);
}
printf("The file has been uploaded already.\n");
exit(1);//還可以顯示此時(shí)的文件目錄信息,檢查是否完成了上傳
}
}
else{
bze 66、ro(buf,MAXBUF);
strcpy(buf,"download");
sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));
printf("The filelist supported by server is bellow:\n");
bzero(buf,MAXBUF);
recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,&clen);
printf("%s\n",buf);
printf("Please input the file you want to download :\n");
scanf("%s",filename);
strcpy(buf,filename);
- 溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥事管理與法規(guī)楊世民第2版第一章
- 初中語(yǔ)法-形容詞和副詞
- 《公民的基本權(quán)利和義務(wù)》人教部編版道德與法治課件
- 五年級(jí)上冊(cè)音樂(lè)課件-豐收的節(jié)日(2)|人音版(簡(jiǎn)譜)最新
- 企業(yè)家商業(yè)計(jì)劃培訓(xùn)教程75275
- 員工保密意識(shí)及技能教育培訓(xùn)課件
- [精選]CAINA肖爾布拉克營(yíng)銷(xiāo)戰(zhàn)略規(guī)劃(PPT 174頁(yè))5799
- 教育專(zhuān)題:18___跨越百年的美麗
- 北魏孝文帝的改革措施
- 教育專(zhuān)題:兒童防拐教案1
- 數(shù)據(jù)隔離級(jí)別
- 最新2018清新簡(jiǎn)約工作匯報(bào)模板【ppt精美模板】
- 電子工藝第5章(精品)
- [精選]中化公司銷(xiāo)售培訓(xùn)77824
- (連云港專(zhuān)版)中考?xì)v史復(fù)習(xí) 第2單元 中國(guó)近代史 第9課時(shí) 抗日戰(zhàn)爭(zhēng)和人民解放戰(zhàn)爭(zhēng)的勝利課件 北師大版