




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、局域網(wǎng)文件傳輸系統(tǒng)項目說明需求說明:1, 開發(fā)平臺1.1 linux x86 641.2 支持 Debian Ubuntu1.3 支持 rhel, centos, Fedora2, 功能說明1.1文件上傳與下載,講指定文件上傳到服務(wù)器,抑從服務(wù)器下載文件到指定位置1.2文件瀏覽,瀏覽本地文件以及服務(wù)器端文件1.3概要功能說明1.3.1 客戶端主要任務(wù):1)分析用戶輸入的命令2)根據(jù)命令向服務(wù)器端發(fā)出請求3)等待服務(wù)器返回的結(jié)果表1 1命令含義與請求碼用戶輸入的命令命令含義對應(yīng)的請求碼Get從服務(wù)器得到文件GETPut向服務(wù)器傳輸文件PUTCd進入客戶端的目錄不需要與服務(wù)端通信,因此無請求!cd
2、進入服務(wù)器端目錄CDLs列出客戶端當(dāng)前的內(nèi) 容不需要與服務(wù)端通信因此無請求!ls列出服務(wù)器端當(dāng)前的 內(nèi)容LSConnect連接服務(wù)器:發(fā)出連接請求,不需要服務(wù)器額外處理Bye退出程序BYE表1 2命令的格式命令的名稱格式說明getget arg1 arg2。arg1:源文件 arg2:本地路徑。arg1, arg2都是絕對路徑putput arg1 arg1。arg1 :本地文件 arg1:目標(biāo)路徑。arg1 arg2都是絕對路徑!cd!cd arg1。arg1:指定的服務(wù)器目錄。絕對路徑!ls!ls arg1。arg1:指定的目錄。絕對路徑connectconnect arg1。arg1 :
3、點分十進制 IP地址cdcd arg1。arg1:客戶端的指定目錄,絕對路徑lsls arg1。arg1 :客戶端指定目錄,絕對路徑byebye。1.3.2 服務(wù)器端主要任務(wù)1)分析請求代碼2)根據(jù)請求代碼做相應(yīng)的處理3)等待返回結(jié)果或者應(yīng)答信息表1 3請求碼與相應(yīng)處理請求代碼對應(yīng)的處理GET向客戶端傳輸文件PUT接受客戶端的文件CD進入目錄LS將當(dāng)前目錄內(nèi)容傳輸給客戶端BYE斷開連接通信協(xié)議與服務(wù)器模型: 本項目通信協(xié)議分兩種 對于get命令和! Is命令這些需要傳輸文件內(nèi)容的命令(!ls需要傳輸列出的目錄文件列表),采用四次握手的通信協(xié)議如圖1_1所示傳輸?shù)奈募?nèi)容客戶端命令應(yīng)答信息RDY
4、信息圖1_1四次握手通信協(xié)議以get命令舉例,get命令首先發(fā)出get請求,服務(wù)器程序接收到請求后,發(fā)送請求的文件長度或者錯誤應(yīng)答碼,接收到文件長度后客戶端發(fā)送RDY應(yīng)答信息,服務(wù)器端開始傳輸文件內(nèi)容1 2所示對于!CD命令這種不需要傳輸文件內(nèi)容的命令采取兩次握手通信協(xié)議,如圖客戶端命令ServerClie nt命令執(zhí)行是否成功ServerClie nt圖1_2兩次握手通信協(xié)議本項目服務(wù)器采用多線程并發(fā)服務(wù)器模型,提供和客戶端的交互。3, 源代碼目錄結(jié)構(gòu)SvrI common.h總領(lǐng)整個服務(wù)器程序的頭文件I command.h定義命令處理函數(shù)和初始化函數(shù)頭文件I command.c定義命令處理
5、函數(shù)和初始化函數(shù)I main.c定義程序主干函數(shù)1 makefileCliI comm on .h總領(lǐng)整個服務(wù)器程序的頭文件,常用通文件皆放與此I command.h定義命令處理函數(shù)和初始化函數(shù)頭文件I command.c定義命令處理函數(shù)和初始化函數(shù)I main.c客戶端主干函數(shù) .I input.c定義命令分解函數(shù),用于處理用戶輸入的命令1 makefile4, 核心函數(shù)及數(shù)據(jù)結(jié)構(gòu)定義4.1客戶端int do_co nn ect(char *ip, i nt *sock_fd);與服務(wù)器端進行連接int do_get(const char *src, const char *dst, int
6、 sock_fd);從遠端服務(wù)器下載文件int do_put(const char *src, const char *dst, int sock_fd);向遠端服務(wù)器上傳文件 int do_cd(char *path);進入當(dāng)前主機指定目錄 int do_ls(char *path);列出當(dāng)前主機指定目錄下的內(nèi)容 int do_serv_cd(char *path, int sock_fd);進入遠端服務(wù)器指定目錄 int do_serv_ls(char *path, int sock_fd);列出當(dāng)前服務(wù)器目錄信息 int bye(int sock_fd);退出服務(wù)器,關(guān)閉連接 int s
7、plit(struct commamd_line, char line); 拆分命令相關(guān)函數(shù)struct comma nd_li nechar *n ame;命令的名稱char *argvMAX_ARG;命令攜帶的參數(shù);MAX_LINE1024向服務(wù)器端發(fā)送命令的最大長度PORT8000端口號COMMAND_LINE256用戶輸入客戶端命令的最大長度MAX LENGTH64每個參數(shù)或命令的最大長度4.2服務(wù)器int do_get(const char *src, const char *dst, int sock_fd);處理用戶的 put 命令int do_put(const char *s
8、rc, const char *dst, int sock_fd);處理用戶的 get 命令int do_cd(char *path); 處理用戶的!cd 請求int do_ls(char *path);處理用戶的!ls 請求ADDR_LEN 17點分十進制IP地址的長度,包括最后的結(jié)束符5, 客戶端執(zhí)行流程5.1輸出提示信息5.2接受用戶輸入的命令5.3輸入命令是否為空,為空則程序正常退出,非空則繼續(xù)5.4輸入命令是否為bye,是則程序正常退出,否則繼續(xù)5.5處理用戶輸入的命令5.6輸出提示信息,繼續(xù)循環(huán)執(zhí)行5.1 5.5的過程6, 服務(wù)器執(zhí)行流程6.1服務(wù)器啟動6.2是否接收到一個連接,是
9、則繼續(xù),否則等待6.3創(chuàng)建連接是否成功,是則繼續(xù),否則打印出錯信息6.4創(chuàng)建一個子線程,是則繼續(xù),否則打印出錯信息6.5接收客戶端傳輸?shù)拿?.6解析命令6.7重復(fù)6.26.6過程部分測試命令(取決于你放文件的位置,僅供參考):put /home/ubu ntu/L in ux_Ser_Cli/Clie nt/text/a.txt /home/ubu ntu/L in ux_Ser_Cli/Server/text put /home/ubu ntu/L inu x_Ser_Cli/Clie nt/text/user.txt /home/ub un tu/Li nu x_Ser_Cli/Serv
10、er/text get /home/ubuntu/Linux Ser Cli/Server/text/b.txt /home/ubuntu/Linux Ser Cli/Client/text源文件:客戶端:/Clie nt commo n.h#pragma once#i nclude <stdio.h>#i nclude <stdlib.h>#in clude "comma nd.h"/Clie nt comma nd.h #pragma once #i nclude "commo n.h" #i nclude <stri
11、ng.h>int do_get(c onst char *src, const char *dst, int sock_fd);/端服務(wù)器下載文件一int do_put(c onst char *src, const char *dst, int sock_fd);/端服務(wù)器上傳文件int do_cd(char *path);/前主機指定目錄int do_ls(char *path);/前主機指定目錄下的內(nèi)容int do_serv_cd(char *path, int sock_fd);/端服務(wù)器指定目錄int do_serv_ls(char *path, int sock_fd);/前
12、服務(wù)器目錄信息一int bye(i nt sock_fd);/務(wù)器,關(guān)閉連接int split(struct comma ndine *com, char lin e);/命令相關(guān)函數(shù)一char * path_alloc(size_t *sizep);/存放完整路徑的內(nèi)存空間起始地址和大小int in put();struct comma ndine comd;int sock_fd;#i nclude <stdlib.h>#i nclude <sys/types.h>#i nclude <sys/socket.h>#in clude <arpa/i
13、net.h>#in clude <dire nt.h>#i nclude <uni std.h>#i nclude verrno .h>#in clude <limits.h>#defi ne MAX_LINE 1024器端發(fā)送命令的最大長度#defi ne PORT8000#defi ne COMMAND_LINE 256入客戶端命令的最大長度#defi ne MAX_LENGTH 64數(shù)或命令的最大長度#defi ne MAX_ARG 4struct comma ndine _char *n ame;/char *argvMAX_ARG; /
14、; 一int do_c onn ect(char *ip, int *sock_fd);器端進行連接/向服務(wù)/端口號/用戶輸/每個參命令的名稱命令攜帶的參數(shù)/與服務(wù)從遠 向遠 進入當(dāng) 列出當(dāng)進入遠 列出當(dāng) 退出服 拆分 獲取int argv;/輸入的參數(shù)個數(shù)/Clie nt comma nd.c#i nclude "common .h"int do_co nn ect(char *ip, i nt *sock_fd) /與服務(wù)器端進行連接 一 一in t res;sockle n_tlen;char buf1OO=""struct sockaddr_i
15、n svraddr,cliaddr;bzero(&cliaddr,sizeof(cliaddr);/ 把一段內(nèi)存區(qū)的內(nèi)容全部設(shè)置為0*sock_fd = socket ( PF_INET, S0CK_STREA0);svraddr. sin_family = AF_INET;svraddr. sin_port= htons (1234);inet_pton (AF_INET,ip,&(svraddr. sin_addr );res = connect (*sock_fd,(structsockaddr *)(&svraddr),sizeof(svraddr);read
16、(*sock_fd,buf,sizeof(buf);printf ("%sn",buf);/prin tf("Co nnet ServerScuess!n")return res;int do_cd(char *path) /進入當(dāng)前主機指定目錄char *ptr; /記錄改變后的文件目錄size_t size;if( chdir (path) < 0)perror ("chdir failed!n");ptr = path_alloc(&size); /our own fun cti onif( getcwd (ptr
17、,size) = NULL)perror ("getcwd failed!n");printf ("cwd = %sn",ptr);return 0;int do_ls(char *path) /列出當(dāng)前主機指定目錄下的內(nèi)容DIR *dp;struct dire nt *dirp;if(dp = ope ndir(path) =NULL)printf ("ca n't ope n %sn ",path);while(dirp = readdir(dp) !=NULL)printf ("%sn",dirp-&
18、gt;d_ name); _closedir(dp);return 0;int do_put(c onst char *src, const char *dst, i nt sock_fd) /向遠端服務(wù)器上傳文件一FILE * fp;char b_tMAX_LENGTH;/ 記錄 argv1的臨時變量char bufferMAX_LINE;char file_nameMAX_LENGTH;int file_block_le ngth = 0;/文件int i = O.,j = 0,le n = 0;int res = 0;if(sock_fd >= 0)printf ("Cr
19、eate Socket Sucess!n");elseperror ("Failed!n");exit (1);write (sock_fd,,sizeof();/向服務(wù)器發(fā)送操作符printf ("comd .n ame:%sn",comd. name); bzero(buffer,sizeof(buffer);strcpy (buffer,src);send (sock_fd,buffer,sizeof(buffer),O);/sen d(sock_fd,src,sizeof(src),O);printf
20、 ("src:%sn",buffer);bzero(buffer,sizeof(buffer);strcpy (buffer,dst);send (sock_fd,buffer,sizeof(buffer),O);printf ("dst:%sn",buffer);recv (sock_fd,buffer,sizeof(buffer),O);/Readyprintf ("buffer:%sn",buffer);if( strcmp (buffer,"Ready") = 0)bzero(buffer,sizeof(b
21、uffer);strcpy (b_t,src);len = strle n (b_t);i = len - 1;while(b_ti != '/')/* 提取文件名 */i-;i+;while(i < len)file_ namej+ = b_ti;i+;file_namej = '0'send (sock_fd,file_ name,sizeof(fi le_n ame),0);printf ("Se nd Server File Name:%sn",file_ name);bzero(buffer,sizeof(buffer);re
22、cv (sock_fd,buffer,sizeof(buffer),0);printf ("Recv From Server:%sn",buffer);/OKbzero(buffer,sizeof(buffer);fp = fopen (src,"r");if( NULL= fp )printf ("File:t%s Not Fou ndn", file_name); _elsebzero(buffer, sizeof(buffer);while( (file_block_le ngth =fread (buffer,sizeof(c
23、har),MAX_LINE,fp)>O)printf ("file_block_le ngth=%dn",file_block_le ngth);res = send (sock_fd,buffer,file_block_length+1,0);if(res<0)printf ("Se nd File:t%s Failedn",file_ name);break; bzero(buffer, sizeof(buffer);/*這段代碼是循環(huán)讀取文件的一段數(shù)據(jù),在循環(huán)調(diào)用send ,端,這里強調(diào)一點的TCP每次接受最多是1024字節(jié)多了就會分片
24、,因此每次發(fā)送時盡量不要超過1024字節(jié)。*/fclose (fp);printf ("File:t%s Tran sfer Fin ishedn",file_ name); _elseprintf ("NOT Ready!n");return 0;int do_get(c onst char *src, const char *dst, i nt sock_fd) /從遠端服務(wù)器下載文件int len gth = 0;int write_le ngth;/寫入文件長度char file_nameMAX_LENGTH;char bufferMAX_LIN
25、E;char b_tMAX_LENGTH;/ 記錄 argv1量FILE * fp;int i = 0,le n = 0,j = 0;if( sock_fd < 0) _printf ("Create Socket Failed!n");exit (1);elseprintf ("Creat Socket Scuess!n");write (sock_fd,,sizeof();/發(fā)送操作符printf ("comd .n ame:%sn",comd. name); bzero(buffer,s
26、izeof(buffer);strcpy (buffer,src);send (sock_fd,buffer,sizeof(buffer),0);發(fā)送到客戶的臨時變向服務(wù)器printf ("src:%sn",buffer);bzero(buffer,sizeof(buffer);strcpy (buffer,dst);send (sock_fd,buffer,sizeof(buffer),0);printf ("dst:%sn",buffer);bzero(buffer,sizeof(buffer);recv (sock_fd,buffer,sizeof
27、(buffer),0);/Readyprintf ("From Server:%sn",buffer);if( strcmp (buffer,"Ready") = 0) bzero(buffer,sizeof(buffer);bzero(file_ name, sizeof(file_ name);strcpy (b_t,src);len =strlen(b_t);/* 提取文件名 */i = len - 1;while(b_ti != '/')i-;i+;while(i<le n)file_ namej+ = b_ti;i+;se
28、nd (sock_fd,file_name,sizeof(file_name),0);printf("File Name :%sn",file_name);strcpy(buffer,dst);/連接文件名和所要放的文件夾位置strcat(buffer,"/");strn cat(buffer,file_ name,strle n (file_ name);fp = fopen (buffer,"w+");if( NULL= fp )printf ("File:t%s Can Not Ope n To Writen"
29、;, file_ name);/從服務(wù)器接收數(shù)據(jù)到buffer中bzero(buffer,sizeof(buffer);while(le ngth =recv (sock_fd,buffer,sizeof(buffer),0) > 0)/循環(huán)接收,再寫到文件printf ("le ngth:%dn",le ngth);write_le ngth =fwrite (buffer,sizeof(char),le ngth-1,fp);if(write_le ngth = len gth) _if(write_le ngth < MAX_LINE) break; bz
30、ero(buffer,sizeof(buffer);if(le ngth < 0)printf ("Recieve Data From Server %s Failed!n",src);exit (1);printf ("Recieve File:t %s From Server%sFin ishedn",file_ name, src);fclose (fp);elseprintf ("NOT Ready!n");return 0;int do_serv_cd(char *path, int sock_fd)/遠端服務(wù)器指定目
31、錄char bufMAX_LINE=""write (sock_fd,,sizeof();/操作符一strcpy (buf,path); printf ("se nd to server:%sn",buf);send (sock_fd,buf,sizeof(buf),0);bzero(buf,sizeof(buf);recv (sock_fd,buf,sizeof(buf),0);printf ("recv from server:%sn",buf); return 0;int do_serv_ls
32、(char *path, int sock_fd)/當(dāng)前服務(wù)器目錄信息一進入首先發(fā)送列出char bufMAX_LINE=""write (sock_fd,,sizeof(); / 操作符一strcpy (buf,path);printf("se nd to server:%sn",buf);send (sock_fd,buf,sizeof(buf),0);bzero(buf,sizeof(buf);while(1)bzero(buf,sizeof(buf);recv (sock_fd,buf,sizeof(buf),
33、0);if( strcmp (buf,"Finish") = 0)break;printf ("%sn",buf);return 0;int bye(i nt sock_fd)/務(wù)器,關(guān)閉連接char buf5=""write (sock_fd,"BYE",4);recv (sock_fd,buf,sizeof(buf),0);/ prin tf("%sn",buf);close(sock_fd);printf ("Close lin ks!n");return 0;首先發(fā)送
34、退出服/Clie nt in put.c#i nclude "common .h"int in put(i nt *le n)char Comma ndCOMMAND_LINE=""/int argv;printf ("Please En ter Comma nd And Path!n"); gets (Command);*le n =strle n (Comma nd);if( strcmp (Command,"bye") = 0)len = -1;memset(&comd,0, sizeof(comd)
35、;argv = split(&comd,Comma nd); return argv;拆分命令相關(guān)函int split(struct comma ndine *com, char lin e) /數(shù)_char ca_tmpCOMMAND_LINE=""int i = 0;int j = 0;int k = 0;int flag = 1;int len =strle n (li ne);for(i = 0;i < 4;i+)com->argvi=(char *) malloc (sizeof(char)*64);for(i = 0;i <= len
36、;i+)if(li nei != ' ' && lin ei != '0')flag = 0; ca_tmpj+ = lin ei; _else if(flag = 0)ca_tmpj = '0'/prin tf("ca_tmp:%sn",ca_tmp);/com->argvk=(char *)malloc(sizeof(char);strcpy (com->argvk,ca_tmp);/prin tf("com->a:%sn",com->argvk);flag =
37、1; j = 0; memset(ca_tmp,0,sizeof(ca_tmp); k+;com->name=(char *) malloc (sizeof(char)*64); strcpy (com->name,com->argv0);return k;/Clie nt Own_Fu nctio n.c#in elude "comma nd.h"#ifdef PATH_MAXstatic long pathmax = PATH_MAX;#elsestatic long pathmax = 0;#en difstatic long posix_versi
38、 on = 0;static long xsi_versi on = 0;/*If PATH_MAX is in determ in ate ,no guara ntee this is adequate*/ #defi ne PATH_MAX_GUESS 1024char *path_alloc(size_t *sizep) 一 一char *ptr;size_t size;if(posix_versi on = 0)posix_version = sysco nf(_SC_VERSION); if(xsi_versi on = 0)xsi_version = sysco nf(_SC_XO
39、PEN_VERSION); if(pathmax = 0)errno = 0;if(pathmax = pathco nf("/",_PC_PATH_MAX) < 0)if( errno = 0)pathmax = PATH_MAX_GUESS; elseprintf ("pathco nf error for _PC_PATH_MAX");elsepathmax+;if(posix_version < 200112L) && (xsi_version < 4)size = pathmax + 1;elsesize =
40、pathmax;if(ptr = malloc (size) = NULL)printf ("malloc error for path name");if(sizep != NULL) *sizep = size;return(ptr);/Clie nt main .c#i nclude "commo n.h"intmain ()int arg = 0;int len = 0;int sock_fd;in t res;char ip100=""printf ("Please en ter IPv4 !n");ge
41、ts (ip);res = do_c onn ect(ip,&sock_fd);if(res != 0)perror ("Connect Server Failed!n");/exit(1);while(1)printf("P lease en ter the comma nd to be operat in g.n");loop:arg = in put(&le n);if(le n = 0)perror ("The in put is empty,Will be exit!n");sleep(2);goto loo
42、p;else if(le n = -1)perror ("You in put 'bye',the programme wil be exit!n"); sleep(1);bye(sock_fd);exit (1);if(arg = 2)if( strcmp (,"cd") = 0) do_cd(comd.argv1);else if( strcmp (,"ls") = 0) do_ls(comd.argv1); _else if( strcmp (,"!
43、cd") = 0)strcpy (,"CD"); do_serv_cd(comd.argv1,sock_fd); 一一 一else if( strcmp (,"!ls") = 0)strcpy (,"LS"); do_serv_ls(comd.argv1,sock_fd); 一一 一else if(arg = 3)if( strcmp (,"get") = 0)strcpy (,"GET"); d
44、o_get(comd.argv1,comd.argv2,sock_fd); 一 一 else if( strcmp (,"put") = 0) strcpy (,''PUT");/prin tf("%d,%d,%dn",sizeof(*(comd. name),sizeof(*(comd.argv 1),sizeof(*(comd.argv2);/ prin tf("%sn%sn",comd.argv1,comd.argv2); do_put(comd.argv1,comd
45、.argv2,sock_fd); 一 一 else printf ("Too many parameters or Too few parameters!n");goto loop;elseprintf ("Too many parameters or Too fewparameters!' n"); goto loop;return 0;/Clie nt Makefile:mai n: mai n.o comma nd.o Own_Fun ctio n.o in put.ogcc -o main mai n.o comma nd.o Own_F
46、un ctio n.o in put.o mia n. o:mai n.cgcc -c mai n.ccomma nd.o:comma nd.cgcc -c comma nd.cOwn_Fun ctio n. o:Ow n_Fun ctio n.cgcc -c Own_Function.cin put.o:i nput.cgcc -c in put.c.PHONY:clea nclea n:rm -rf *.o mai n服務(wù)器端:/Server com mon .h #i nclude <stdio.h> #i nclude <stri ng.h> #i nclude
47、 <stdlib.h> #i nclude <sys/types.h> #i nclude <sys/socket.h> #in clude <arpa/i net.h> #in clude <dire nt.h> #i nclude <uni std.h> #i nclude <errno .h> #in clude <limits.h>向服務(wù)端口號用戶輸每個參#defi ne MAX_LINE 1024/器端發(fā)送命令的最大長度#defi ne PORT8000/#defi ne COMMAND_
48、LINE 256/入客戶端命令的最大長度#defi ne MAX_LENGTH 64/數(shù)或命令的最大長度int do_c onn ect(char *ip,i nt *serv,i nt *sock_fd);/務(wù)器端進行連接與服int do get(const char *src, const char *dst, int sock fd);/ 端服務(wù)器下載文件從遠int do put(const char *src, const char *dst, int sock fd);/ 端服務(wù)器上傳文件向遠int do_cd(char *path,i nt sock_fd);/當(dāng)前主機指定目錄進入
49、int do_ls(char *path,i nt sock_fd);/當(dāng)前主機指定目錄下的內(nèi)谷列出char * path_alloc(size_t *sizep);/存放完整路徑的內(nèi)存空間起始地址和大小獲取int sock_fd;/Clie nt comma nd.c#i nclude "common .h"int do_c onn ect(char *ip, i nt *serv,i nt *sock_fd) /與客戶端端進行連接_structsockaddr_i nsvraddr,cliaddr;int res;in t le n;*serv =socket ( PF
50、_INET, SOCK_STREAM);svraddr.sin_family =AF_INET;svraddr.sin_port =htons (1234);inet_pton (AF_INET, "", &(svraddr.sin_addr );res= bind (*serv,(struct sockaddr*)(&svraddr),sizeof(svraddr);if(res != 0)perror ("Err in bindn");exit (1);liste n (*serv, 5);len=sizeof(st
51、ructsockaddr_i n );*sock_fd= accept (*serv,(struct sockaddr *)(&cliaddr),&len); send (*sock_fd,"YES,Co nn ect Sucess!",20,0);return 0;int do_cd(char *path, int sock_fd) /進入當(dāng)前主機指定目錄 一 一char *ptr; /記錄改變后的文件目錄size_t size;if( chdir (path) < 0)perror ("chdir failed!'n")
52、;ptr = path_alloc(&size);if( getcwd (ptr,size) = NULL)perror ("getcwd failed!n");printf ("cwd = %sn",ptr);send (sock_fd,ptr,sizeof(ptr),0);return 0;int do_ls(char *path,i nt sock_fd) /列出當(dāng)前服務(wù)器目錄下的內(nèi)容DIR *dp;char buf1024;struct dire nt *dirp;printf ("e nter!n");if(dp =
53、 ope ndir(path) =NULL)printf ("ca n't ope n %sn ",path);while(dirp = readdir(dp) !=NULL)bzero(buf,sizeof(buf);strcpy (buf,dirp->d_name);send (sock_fd,buf,sizeof(buf),0);printf ("%sn",dirp->d_ name);se nd (sock_fd,"Fi nish",7,0);printf ("Fi ni shn");c
54、losedir(dp);return 0;int do_put(c onst char *src, const char *dst, i nt sock_fd) /向客戶端傳送文件FILE * fp;char b_tMAX_LENGTH;/ 記錄 argv1的臨時變量char bufferMAX_LINE;char file_nameMAX_LENGTH;文件/int file_block_le ngth = 0;int i = 0,j = O,le n = 0;if(sock_fd >= 0)printf ("Create Socket Sucess!n");els
55、eperror ("Failed!n");exit (1);send (sock_fd,"Ready",7,0);/Ready _ bzero(buffer,sizeof(buffer);recv (sock_fd,file_name,sizeof(file_name),0);/接收客戶端的文件名printf ("Recv Clie nt File Name:%sn",file_name);fp = fopen (src,"r");if( NULL= fp )printf ("File:t%s Not F
56、ou ndn", file_name);elsebzero(buffer, sizeof(buffer);while( (file_block_le ngth =fread (buffer,sizeof(char),MAX_LINE,fp)>0) _printf ("file_block_le ngth=%dn",file_block_le ngth);if( send (sock_fd,buffer,file_block_length+1,0)<0)一 一 一printf ("Se nd File:t%s Failed'n",file_ name);break; bzero(buffer, sizeof(buffer);/*這段代碼是循環(huán)讀取文件的一段數(shù)據(jù),在循環(huán)調(diào)用send,發(fā)送到客戶端,這里強調(diào)一點的TCP每次接受最多是1024字節(jié)多了就會分片,因此每次發(fā)送時盡量不要超過1024字節(jié)?;蛘哌x擇4096效率比較高*/fclose (fp);printf ("File:t%s Tran sfer Fin ishedn",file_ name);return 0;int do_get(c onst char *sr
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南海區(qū)課題申報書
- 護理課題申報書范本
- 教學(xué)課題的申報書
- 合作購銷產(chǎn)品合同范例
- 商法學(xué)課題申報書
- 眼科課題申報書范文
- 江西省中醫(yī)課題申報書
- 【復(fù)習(xí)大串講】【中職專用】高二語文上學(xué)期期末綜合測試題(五)(職業(yè)模塊)(解析版)
- 做廣告物料合同范本
- 合作加工木炭合同范本
- 養(yǎng)老機構(gòu)安全隱患排查清單、自查表、治理整改臺賬
- 5.1 數(shù)據(jù)安全概述
- 幼兒園百科常識100題
- led燈具生產(chǎn)工藝過程流程圖
- 創(chuàng)意美術(shù)課3歲-12歲大師課《彼埃.蒙德里安》課件
- 哲學(xué)與人生(中職)PPT完整全套教學(xué)課件
- 社區(qū)免費使用房屋協(xié)議書
- 財務(wù)分析模板(43張)課件
- 一年級語文下冊《我多想去看看》教案
- 城市供水管網(wǎng)供水管網(wǎng)檢漏技術(shù)及儀器設(shè)備應(yīng)用課件
- 工程EPC總承包項目安全生產(chǎn)管理辦法
評論
0/150
提交評論