socket文件傳輸源代碼要點(diǎn)
《socket文件傳輸源代碼要點(diǎn)》由會員分享,可在線閱讀,更多相關(guān)《socket文件傳輸源代碼要點(diǎn)(28頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、摘要 線程(thread )技術(shù)早在60年代就被提出,但真正應(yīng)用線程到操作系統(tǒng)中去, 是在80年代中期。為什么有了進(jìn)程的概念后,還要再引入線程呢?使用多線程 到底有哪些好處? 使用多線程的理由之一是和進(jìn)程相比,它是一種非常"節(jié)儉”的多任務(wù)操作方 式。在Linux系統(tǒng)下,啟動一個新的進(jìn)程必須分配獨(dú)立的地址空間, 建立眾多的 數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段。而運(yùn)行于一個進(jìn)程中的多個線程, 它們之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動一個線程所花費(fèi)的空間遠(yuǎn) 遠(yuǎn)小于進(jìn)程所花費(fèi)的空間,而且,線程間彼此切換所需的時間也遠(yuǎn)遠(yuǎn)小于進(jìn)程問 所需要的時間。 使用多線程的理由之二是線程間方便的通信
2、機(jī)制。對不同進(jìn)程來說,它們具 有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式費(fèi)時 且很不方便。由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間, 所以一個線程的數(shù)據(jù)可 以直接為其它線程所用,這樣快且方便。 在計算機(jī)中,凡是提供服務(wù)的一方我們稱為服務(wù)端( Server ),而接 受服務(wù)的另一方我們稱作客戶端( Client ) o不過客戶端及伺服端的關(guān)系 不見得一定建立在兩臺分開的機(jī)器上,提供服務(wù)的伺服端及接受服務(wù)的客 戶端也有可能都在同一臺機(jī)器上,這樣在同一臺機(jī)器上就同時扮演伺服端 及客戶端。 線程間方便的通信機(jī)制可以使得在我們在服務(wù)端和客戶端方便的進(jìn)行通信 傳輸與各種操作,可以
3、通過運(yùn)用多線程機(jī)制方便實(shí)現(xiàn)上傳、下載文件;增加、刪 除用戶;以及在服務(wù)端進(jìn)行文件的管理。 關(guān)鍵字:多線程、socket通信、服務(wù)器和客戶端 , 1需求分析 這次課程設(shè)計的要求是在以Linux為內(nèi)核的操作系統(tǒng)下,實(shí)現(xiàn)多線程文件傳 輸系統(tǒng)功能模塊。系統(tǒng)模塊分為服務(wù)器和客戶端兩部分, 客戶端實(shí)現(xiàn)對文件的上 傳、下載和查看服務(wù)器默認(rèn)路徑下的文件列表;服務(wù)器可以對文件進(jìn)行管理操作, 包括創(chuàng)建、刪除和重命名等。 多線程文件傳輸是一種一對多或者多對多的關(guān)系,一般是一個服務(wù)器對應(yīng)著 多個客戶端??蛻舳送ㄟ^socket連接服務(wù)器,服務(wù)器要為客戶端創(chuàng)建一個單獨(dú) 進(jìn)程(線程)監(jiān)聽每個客戶端的請求。 創(chuàng)建
4、好連接之后文件就可以通過流的形式傳輸。linux內(nèi)核中為我們提供了 兩種不同形式的讀寫流,包括read()、write()和send()、recv()??蛻魴C(jī)對文 件的查看指令也是通過流傳遞給服務(wù)器,服務(wù)器根據(jù)請求類型返回不同相應(yīng)流。 根據(jù)socket原理和特點(diǎn)繪畫出鏈接流程圖,將客戶機(jī)與服務(wù)器的相互通信 劃分為不同的模塊,每個模塊負(fù)責(zé)獨(dú)立的功能項。服務(wù)器輸入指令管理目錄下的 文件,create filename 是創(chuàng)建文件命令, rename oldname newname1重命名文 命令,delete filename是刪除文件命令,同時監(jiān)聽著客戶端的請求;客戶端向 服務(wù)器發(fā)送上傳、下載
5、和查看請求,從而得到不同的相應(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è)計和描述網(wǎng)絡(luò)通信的基 本框架。OSI采用分層的額結(jié)構(gòu)化技術(shù)將通信網(wǎng)絡(luò)分為 7層,從低到高為物理層、 數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層。 TCP/IP參考模型是由美國國防部創(chuàng)建,且發(fā)展至今最成功的通信協(xié)議模型, 與OSI模型對應(yīng),它將網(wǎng)絡(luò)功能分為4層,包括
6、網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層和 應(yīng)用層,每一層都有對應(yīng)的協(xié)議。在傳輸層的主要協(xié)議是 TCP協(xié)議和UDPft、議。 socket連接就是基于TCPB議。TCP是一種可靠地數(shù)據(jù)傳輸協(xié)議。 socket是一種套接口,它把網(wǎng)絡(luò)地址和端口號信息放在一個結(jié)構(gòu)體中, 也就 是套接字地址結(jié)構(gòu)。 結(jié)構(gòu)圖如下: Ip地址 端口號 168.222.222.222 9999 U 7 套接口 222.222.222.222 9999 套接口與ip、端口號的關(guān)系 通用套接口地址數(shù)據(jù)結(jié)構(gòu)定義在<sys/socket.h>頭文件中,形式如下: struct sockaddr { uint8
7、_t sa_len; sa_family_t sa_family; char sa_data[14]; }; 一 IPv4套接口地址數(shù)據(jù)結(jié)構(gòu)以 socketaddr_in 命名,定義在<netinet/in.h> 頭文件中,形式如下: struct socketaddr_in { . unit8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; } . 下圖是 TCP 套接口通信工作流程圖 客戶機(jī)進(jìn)程
8、 服務(wù)器進(jìn)程 TCP套接口通信工作過程 通信工作的大致流程: 1)服務(wù)器先用socket()函數(shù)來建立一個套接口,用這個套接口完成通信的 監(jiān)聽及數(shù)據(jù)的收發(fā)。 2)服務(wù)器用bind()函數(shù)來綁定一個端口號和ip地址,是套接口與指定的 端口號和ip關(guān)聯(lián)。 3)服務(wù)器調(diào)用linsten()函數(shù),是服務(wù)器的端口和Ip處于監(jiān)聽狀態(tài),等待 網(wǎng)絡(luò)中某一個客戶機(jī)的連接請求。 4)客戶機(jī)用socket()函數(shù)建立一個套接口,設(shè)定遠(yuǎn)程ip和端口 5)客戶機(jī)調(diào)用connect。函數(shù)連接遠(yuǎn)程計算機(jī)指定的端口。 6)服務(wù)器調(diào)用accept()函數(shù)來接受遠(yuǎn)程計算機(jī)的連接請求,建立起與客戶 機(jī)之間的
9、通信連接。 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è)計過程 ? 3.1服務(wù)器端創(chuàng)建監(jiān)聽與文件管理 服務(wù)器負(fù)責(zé)的功能模塊主要有兩部分, 一是對連接進(jìn)來客戶端所有線程的管 理和服務(wù)器目錄下的文件管理;二是創(chuàng)建線程來單獨(dú)監(jiān)聽客戶端的動作。 為了使 于管理
10、,我們創(chuàng)建兩個user.txt和client.txt 兩個文檔來分別負(fù)責(zé)服務(wù)器的連 接和客戶端的連接。user.txt中存放了服務(wù)器名和密碼。client.txt 存放了連 接客戶端名字和密碼。 我們首先對服務(wù)器的創(chuàng)建有個監(jiān)測,即在啟動時先核實(shí)服務(wù)器的所有者 username和密碼password,將輸入的用戶、密碼與user.txt 中的用戶密碼比較, 匹配成功則同意啟動,否則return -1 表失敗。 接著創(chuàng)建一個socket套接口,綁定Ip設(shè)置客戶端的最大連接數(shù)為10,然后 創(chuàng)建一個sever線程來實(shí)現(xiàn)對服務(wù)器本身監(jiān)聽動作。主體代碼見最后 接下來創(chuàng)建線程完成對客戶端的監(jiān)聽
11、 監(jiān)聽等待連接: 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_client[10]; 來存放每個客戶端的socket信息、線程標(biāo)識、使用號、連接號和客戶名。 創(chuàng)建線程實(shí)現(xiàn)單獨(dú)監(jiān)聽: p_client[i].conn_fd = sockdata; p_client[i].used = i; strcpy(p_clie
12、nt[i].name , client_name); pthread_create(&p_client[i].tid,NULL,&client_conn,&p_client[i]) 接下來是線程client_conn()的功能 監(jiān)聽客戶端的功能完屏 ? 3.2客戶端連接與文件傳輸 在客戶端這邊我們同樣適用了檢測機(jī)制,運(yùn)行客戶機(jī)時要將用戶名、密碼以 及ip地址和端口號作為參數(shù)輸進(jìn)來,先建立與服務(wù)器的連接,然后將用戶名和 密碼發(fā)送到服務(wù)端檢測,如果檢測失敗則接收到一條拒絕信息, 連接斷開,如果 檢測成功則接收到一條確認(rèn)信息,雙方通信開始。 主體代碼見最后: 到此為止我們已經(jīng)實(shí)現(xiàn)了
13、服務(wù)器和客戶端的主體功能, 具體代碼查看附錄文 件夾。 , 4結(jié)果演示 編譯完成的serve和client Icon Vi ew Plates * X 謫wl K Desktop _ File System -j Network _ Floppy Dr,.. 1 Tfdih ,文檔 ,音樂 日褸罰 L下Q download fuel 4s rec i eve send *i.ncl ^LrtCl 桌面 出腿 Wif client client c server serverx temp.txt 創(chuàng)建文檔a down
14、load red eve ② client — *it-cL $erv^r 更面 fan cl find 力口「1 servers atxt rerif fKlf rent wiv client c wl@>ut>untu:- file Edit yiew Search Terminal help Please input your choice bellow; 工:Create a new file. 2: Delete a file. 3: Rename a known filer I Please input The file has t
15、he new file name:a.txt created successfully. 將文檔a改名為 download 令 client recieve 臬面 ?r 口仁 i *incl *tncl ■find b.txt FC L reci? rie 『皿七 機(jī)M *incl ifincl cbent.c server server.c temp.txt wt^pubuntu:一 Fite Edit View Search Terminal Help Please input a .tzt Please input b.txt File a.txt
16、 ttie file name you warn to rename: the new file name: renamed to b.txt 將 文 recievel send i/iew Bookmarks Help send ■ 口 wl^ubuntu:- [file Edit yiew search lerminal Hdp b.txt please input the path you want to upload end with y : send/ b. txt The file The file lengsize The file PU
17、ase input the file you want to upload; open successfully! is uploading newr.. ii 2 txt 3.txt a. txt has been uploaded already. 謂l@buntu:7 口 b.txt Co Bookmarks Help wl 典 buntu:一 ii 2.txt 3Xxt b.txt a.txt 將文檔 a上傳由send上傳至U recieve2 File Edit View Search Terminal Help please
18、 input the path you want to upload end with /: send/ Please input the file you want t。 upload: b. txt The file open successfully! Iitie file is uploading now.. r lengsize = 5 The file has been uploaded already. wl@ubuntu:7 " 「 - 并 連 接 服 務(wù) 器 wl^ubuntu: * pn wl@ubuntu:一 File Edit
19、 view search TemninaL Help wl@ubumu:F . /server Please choose your choice bellow: l:Marage rhe files. 2:connect the clients. File Edit View Search leminal Help Run the server suecessful.ly. And now waiting the client tomfning... 奶 Its username and right, 1123 Its password and right. The cli
20、ent wants to (iovmlcad file. Send the filelist to the eliert... Please input your username:yy 你已拄發(fā)送username(0yy)^ sErver請等待師應(yīng)--- 柝己拄當(dāng)?shù)搅?server的碇或:ye$ Please input your password; 123 1 你 SEj^ password (1123) iS serveri# ... 你巳提得到Tsezer的響應(yīng):yes Please choose eithor upload file or download file be
21、llow: l:uplaad file. 2:download file. recieve/ file:recieve/2.txt The fiteListstring Lengsize = 56 recieve/2.tKt recieve/l,tKt recievt:/3.tKt necieve/a.txt file:recieve/lLtxt open successfully! The filelist supported by server is bellows fiL recieve/2,txt recieve/l.txt recieve/a.txt reciev
22、e/a.txt Please input the file you want to download : Hie fileLLstStrlng clii 陶5 been sent to The download recieve send server clientc serverx FfClf re-ri€ reci* FMlf fip-cl ?iheI *incl 科幾cl #incl *mci *inl 下 載 文
23、 Co Bookmarks Hetp , w wi recieve Please input the file you want to download : 3.txt go goakrnarks Help O wl(pubuntu: [He Edit View Search lerminal Help File Edit View Search Terminal Help l:upload file. 2idawnload file. The filelist supported by server is bellow: recie
24、ve/2,txt recieve/1.txt
recieve/3.1xt
recieve/a.txt
The client thoosen file: 3,txt
The file open successfully
The file is downloading to the client now
The file has been downloaded already.
wl@ubunttJ:4$ 口 ,-
l.txt 3.txt
文 檔 后
l.txt
具體代碼如下:
服務(wù)器:
#include
25、
#include
26、eList functions */ int fileSize(char fileName[]); //文件信息 typedef struct fileinfo{ char name[256]; char fullName[1024]; int size; time_t mod_time; char type[10]; }fileinfo; //文件列表 typedef struct filelist { fileinfo file; struct filelist* nextfile; 押eList; //function getfilelist //輸入目
27、錄名 //輸出目錄下的文件列表頭指針 fileList * getFileList(char name[1024]) { fileList *head=NULL; fileList *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; //
28、 打開目錄 dir=opendir(name); 讀文件描述表 II while(dir_env=readdir(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);// 獲取文件描述信息 // 將2件信息存版到鏈表中 // 產(chǎn)生
29、臨時節(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); // 文件大小 // 文件類型 if( S_ISDIR(stat_file.st_mode)) cur->file.size = 0; strcpy(cur->file.type,"mulu"); strcat(cur->file.fullName
30、,"/"); }else { cur->file.size = stat_file.st_size; strcpy(cur->file.type,"file"); } // 修改日期 cur->file.mod_time = ctime(&stat_file.st_mtime); // 將臨時節(jié)點(diǎn)插入head中 if(head->nextfile ==NULL) { head->nextfile = cur; cur->nextfile = NULL; }else { cur->nextfile = head->nextfile; head->nextfile =
31、cur; 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)前目錄 printf("%s ",head->file.fullName); printf("\n"); // 輸出head中的
32、文件 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⑴; } while(temp) { // 判斷是否為文件,是文件顯示文件 // 若為目錄,將目錄名放入隊列,求隊列目錄 if (strcmp(temp->file.type,"file")
33、==0) { bzero(fileListString,MAXBUF); printf("file:%s ",temp->file.fullName); strcat(fileListString,temp->file.fullName); strcat(fileListString,"\n"); while ((strlen(fileListString)) > 0) { int write_length = fwrite(fileListString, sizeof(char), strlen(fileListString), file); if (write_leng
34、th < strlen(fileListString)) {. printf("File Write into Failedn"); break; } bzero(fileListString, MAXBUF); } }else{ if(i>=1024) { printf("there are too many direcotry\n"); return; } // 頭節(jié)點(diǎn)初始化 headArray[i] = getFileList(temp->file.fullName); // 頭節(jié)點(diǎn)名稱 strcpy(headArray[i]->file.fullName,
35、temp->file.fullName); i++; } temp=temp->nextfile; } fclose(file); // 對目錄隊列中目錄使用遞歸,直到結(jié)束 for(j=0;j
36、d) { printf("%s\n",head->file.fullName); head = head->nextfile; } return ; } /* end of fileList functions */ void 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 window[2]; sca
37、nf("%s",window); if((strncmp(window,"1",1))==0){ printf("Please input your choice bellow:\n"); printf("1: Create a new file.\n"); printf("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
38、new file name:"); char filename[20]; scanf("%s",filename); FILE *file; file=fopen(filename,"w"); if(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 fil
39、e name with the file path you want to delete:\n"); char filename[20]; scanf("%s",filename); remove(filename); printf("The file has been deleted successfully.\n"); continue; } else{ printf("Please input the file nameyou want to rename:\n"); char _old[20]; scanf("%s”,_old); printf("Please input
40、 the new file 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 clen; struct sockaddr_in client_addr,server_ad
41、dr; char buf[MAXBUF]; if((ssock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))<0){ perror("socket error:"); exit⑴; } 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; server_addr.sin_addr.s_addr=i
42、net_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:"); exit⑴; } int window=1; while(window!=0){ clen=sizeof(client_addr); recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen);
43、 printf("%s\n",buf); if((strncmp(buf, "0", 1)) == 0) { if((strncmp(buf, "0yy", 7)) == 0) { 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(c
44、lient_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 ,sizeof(client_addr)); printf("Its password and right.\n"); recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)
45、&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 the file uploaded by user is:%s\n",buf); FILE *file; char temp[30]; strcp
46、y(temp,"recieve/"); strcat(temp,buf); file=fopen(temp,"w"); if(file==NULL){ printf("The file is created failed!"); exit⑴; } bzero(buf, MAXBUF); recvfrom(ssock,(void *)buf,MAXBUF,0,(structsockaddr*)&client_addr,&clen); while (strlen(buf) > 0) { int write_length = fwrite(buf, sizeof(char), s
47、trlen(buf), file); if (write_length < strlen(buf)) {. printf("File Write into Failedn"); 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"); //filelis
48、t fileList *mylist; //顯示的目錄 char name[1024]="recieve/"; //取得目錄下文件 //頭指針傳遞的目錄或者文件名 mylist =getFileList(name); strcpy(mylist->file.fullName,name); //顯示目錄下文件 //showList(mylist); //顯示目錄下所有文件 showAllNode(mylist); //send fileList FILE *file; char temp[30]; strcpy(temp,"temp.txt"); file=fop
49、en(temp,"r"); if(file==NULL){ printf("The file cannot open!"); exit⑴; } else{ printf("\nThe fileListString open successfully!\n"); bzero(buf,MAXBUF); int lengsize = 0; while((lengsize = fread(buf,1,MAXBUF,file)) > 0) { printf("lengsize = %d\n",lengsize); sendto(ssock,(void *)buf,MAX
50、BUF,0,(struct sockaddr*)&client_addr,sizeof(server_addr)); printf("%s\n",buf); bzero(buf, MAXBUF); } 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 c
51、lient choosen file: %s\n",buf); strcpy(temp,"recieve/"); strcat(temp,buf); file=fopen(temp,"r"); if(file==NULL){ printf("The file is created failed!"); exit⑴; } else{ printf("The file open successfully!\n"); printf("The file is downloading to the client now…\n"); bzero(buf,MAXBUF); int len
52、gsize = 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); } printf("The file has been downloaded already.\n"); } fclose(file); exit(1);// 還可以顯示此
53、時的文件目錄信息,檢查是否 完成了上傳
} close(ssock); window=0;
} else { strcpy(buf,"no"); sendto(ssock,(void *)buf,MAXBUF,0,(struct
sockaddr*)&client_addr ,sizeof(client_addr)); printf("Its password but wrong.\n");
}
}
}
}
}
}
客服端:
#include 54、s.h>
#include 55、[21];
char window;
printf("Please input 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 yo 56、ur username:");
scanf("%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:你暫時不能登錄服務(wù)器server ,請稍后 再登錄…\n");
exit⑴;
}
else{
while(key==0){
memset(&serv 57、er_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,(void *)buf,MAXBUF,0,(struct
sockaddr*)&server_addr,sizeof(server_add 58、r)); printf(" 你已經(jīng)發(fā)送 username(%s)給server 請等待響 應(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((strncmp(buf, "yes", 3)) != 0)
{
printf("The username you inputed is wrong!\n");
window=1;
c 59、lose(ssock);
printf("Please input your username:");
scanf("%s",username);
printf("%s\n",username);
}
else{
close(ssock);
key=1;
}
}
}
printf("Please input your password:");
scanf("%s",password);
printf("%s\n",password);
if((ssock = socket(AF_INET,SOCK_DGRAM,0))<0){
perror("socket erro 60、r:你暫時不能登錄服務(wù)器server ,請稍后 再登錄…\n");
exit⑴;
}
else{
key=0;
while(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);
bzero(temp,21);
strcpy(temp,"1");
printf("%s\n",temp); 61、
strcat(temp,password);
strcpy(buf,temp);
sendto(ssock,(void *)buf,MAXBUF,0,(struct
sockaddr*)&server_addr,sizeof(server_addr));
printf(" 你已經(jīng)發(fā)送 password(%s)給server 請等待響 應(yīng)…\n",buf);
clen=sizeof(client_addr);
recvfrom(ssock,(void *)buf,MAXBUF,0,(struct
sockaddr*)&server_addr,&clen);
printf("你 62、已經(jīng)得到了 server 的響應(yīng):%s\n",buf);
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 and file choose
printf("Please choose 63、 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){
printf("please input the path you want to upload end with /:\n");
scanf("%s",path 64、);
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)); scanf("%s",filename); strcat(path,filename); strcpy(buf,filename); sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_add 65、r,sizeof(server_addr)); FILE *file; file=fopen(path,"r"); if(file==NULL){ perror("The file open failed!"); exit⑴;
} 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)
{
pri 66、ntf("lengsize = %d\n",lengsize); 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);// 還可以顯示此時的文件目錄信息,檢
查是否完成了上傳
}
*)buf,MAXBUF,0,(struct
supported by server is
*)buf,MAXBUF,0,(struct
the file you want to
*)buf,MAXBUF,0,(struct
} else{ bzero(buf,MAXBUF); strcpy(buf,"download"); sendto(ssock,(void sockaddr*)&server_addr,sizeof(server_add
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥事管理與法規(guī)楊世民第2版第一章
- 初中語法-形容詞和副詞
- 《公民的基本權(quán)利和義務(wù)》人教部編版道德與法治課件
- 五年級上冊音樂課件-豐收的節(jié)日(2)|人音版(簡譜)最新
- 企業(yè)家商業(yè)計劃培訓(xùn)教程75275
- 員工保密意識及技能教育培訓(xùn)課件
- [精選]CAINA肖爾布拉克營銷戰(zhàn)略規(guī)劃(PPT 174頁)5799
- 教育專題:18___跨越百年的美麗
- 北魏孝文帝的改革措施
- 教育專題:兒童防拐教案1
- 數(shù)據(jù)隔離級別
- 最新2018清新簡約工作匯報模板【ppt精美模板】
- 電子工藝第5章(精品)
- [精選]中化公司銷售培訓(xùn)77824
- (連云港專版)中考?xì)v史復(fù)習(xí) 第2單元 中國近代史 第9課時 抗日戰(zhàn)爭和人民解放戰(zhàn)爭的勝利課件 北師大版