FTP客户端和服务器源代码实现_第1页
FTP客户端和服务器源代码实现_第2页
FTP客户端和服务器源代码实现_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计:FTP的设计与实现/*chent.c*/#include<winsock2.h>#include<stdio.h>#include<stdlib.h>#pragmacomment;lib,"ws2_32.lib")#defineDEFAULTPORT2302#defineDEFAULTBUFFER2048#defineDEFAULTMESSAGE"Thisisatestoftheemergencybroadcastingsystem"charszServerip128,/Servertoconnecttosz

2、Message1024;/MessagetosendtoseverintiPort=DEFAULT_PORT;/Portonservertoconnectto/DWORDdwCount=DEFAULT_COUNT;/NumberoftimestosendmessageBOOLbSendOnly=FALSE;/Senddataonly;don'treceiveintdirfun();intgetfun();intputfun();intpwdfun();intcdfun();intmdfun();intdelfun();intusafun();voidusage()(printf(&qu

3、ot;usage:client-p:x-s:IP-n:x-onn");printf("-p:xRemoteporttosendton");printf("-s:IPServer'sIPaddressorhostnamen");printf("-n:xNumberoftimestosendmessagen");printf("-oSendmessagesonly;don'treceiven");ExitProcess(1);)voidValidateArgs(intargc,char*arg

4、v)(inti;for(i=1;i<argc;i+)(if(argvi0='-')|(argvi0='/')(switch(tolower(argvi1)(case'p':/Remoteportif(strlen(argvi)>3)iPort=atoi(&argvi3);break;case's':/Serverif(strlen(argvi)>3)strcpy(szServerip,&argvi3);break;case'n':/Numberoftimestosendmessag

5、eif(strlen(argvi)>3)/dwCount=atol(&argvi3);break;case'o':/Onlysendmessage;don'treceivebSendOnly=TRUE;break;default:usage();break;intmain(intargc,WSADATASOCKETcharint/unsignedintchar*argv)wsd;sClient;szBufferDEFAULT_BUFFER;ret;i;/intj;structsockaddr_inserver;structhostent*host=NULL

6、;charchoice5,choice240;/ParsethecommandlineandloadWinsock/argv1="-s:”;strcpy(szServerip,&argv13);/ValidateArgs(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)printf("FailedtoloadWinsocklibrary!n");return1;/strcpy(szMessage,DEFAULT_MESSAGE);/Createthesocket,andattempt

7、toconnecttotheserver/sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sClient=INVALID_SOCKET)printf("socket()failed:%dn”,WSAGetLastError();return1;server.sin_family=AF_INET;server.sin_port=htons(iPort);printf("server.sin_port=%un",server.sin_port);server.sin_addr.s_addr=inet_addr(sz

8、Serverip);/Ifthesuppliedserveraddresswasn'tintheform/"aaa.bbb.ccc.ddd"it'sahostname,sotrytoresolveit/if(server.sin_addr.s_addr=INADDR_NONE)host=gethostbyname(szServerip);if(host=NULL)printf("Unabletoresolveserver:%sn",szServerip);return1;CopyMemory(&server.sin_addr,ho

9、st->h_addr_list0,host->h_length);if(connect(sClient,(structsockaddr*)&server,sizeof(server)=SOCKET_ERROR)printf("connect()failed:%dn",WSAGetLastError();return1;/显示接通信息/for(j=0;j<2;j+)/ret=recv(sClient,szBuffer,DEFAULT_BUFFER,0);if(ret=0)/Gracefulclosereturn0;elseif(ret=SOCKET_

10、ERROR)(printf("recv()failed:%dn",WSAGetLastError();return0;szBufferret='0'printf("%sn",szBuffer);if(ret<15)(ret=recv(sClient,szBuffer,DEFAULT_BUFFER,0);if(ret=0)/Gracefulclosereturn0;elseif(ret=SOCKET_ERROR)(/printf("recv()failed:%dn",WSAGetLastError();return

11、0;szBufferret='0'printf("%sn",szBuffer);/printf("DEFAULT_BUFFER=%dn”,DEFAULT_BUFFER);while(1)(puts("");printf("ftp>");scanf("%s",choice);if(strncmp(choice,"dir",3)=0|strncmp(choice,"DIR",2)=0)(dirfun(sClient);continue;elseif

12、(strncmp(choice,"pwd",3)=0|strncmp(choice,"PWD",3)=0)(pwdfun(sClient);continue;elseif(strncmp(choice,"?",1)=0)(usafun(sClient);continue;)elseif(strncmp(choice,"quit",4)=0|strncmp(choice,"QUIT",2)=0)(break;)scanf("%s",choice2);if(strncmp(cho

13、ice,"get",3)=0|strncmp(choice,"GET",3)=0)(getfun(sClient,choice2);continue;)elseif(strncmp(choice,"put",3)=0|strncmp(choice,"PUT",3)=0)(putfun(sClient,choice2);continue;)elseif(strncmp(choice,"cd",2)=0|strncmp(choice,"CD",2)=0)(cdfun(sClien

14、t,choice2);continue;)elseif(strncmp(choice,"md",2)=0|strncmp(choice,"MD",2)=0)(mdfun(sClient,choice2);continue;)elseif(strncmp(choice,"del",3)=0|strncmp(choice,"DEL",3)=0)(delfun(sClient,choice2);continue;)/elseputs(-输入错误,请重新输入");fflush(stdin);fflush(stdi

15、n);printf("n");printf("n");)closesocket(sClient);WSACleanup();return0;)intdirfun(SOCKETsClient)(intret;char*MSG="dir$”;charszBuffer80;strcpy(szMessage,MSG);ret=send(sClient,szMessage,strlen(szMessage),0);if(ret=0)return1;elseif(ret=SOCKET_ERROR)(printf("send()failed:%dn

16、",WSAGetLastError();return1;)/printf("Send%dbytesn",ret);/printf("bSendOnly=%dn”,bSendOnly);while(!bSendOnly)(/读取流并显示/ret=recv(sClient,szBuffer,80,0);/printf("%s",szBuffer);ret=recv(sClient,szBuffer,80,0);if(ret=0)/Gracefulclosereturn1;elseif(ret=SOCKET_ERROR)(printf(&q

17、uot;recv()failed:%dn",WSAGetLastError();return1;)szBufferret='0'if(strncmp(szBuffer,"226Close",strlen("226Close")=0)(break;)printf("%s",szBuffer);if(strncmp(szBuffer,”500Syntaxerror”,strlen("500Syntaxerror")=0)(break;)return0;)intgetfun(SOCKETsCli

18、ent,charfilename40)(intret;FILE*fpre;charszBuffer80;szMessage0='0'strcat(szMessage,"get$”);/strcat(szMessage,"");strcat(szMessage,filename);/printf("MSG4=%cn”,szMessage4);/szMessage0='g'szMessage1='e'szMessage2='t'/szMessage4='m'szMessage5=

19、'e'szMessage6='.'szMessage7='t'/szMessage8='x'szMessage9='t'szMessage10='0'ret=send(sClient,szMessage,strlen(szMessage)+1,0);if(ret=0)return1;elseif(ret=SOCKET_ERROR)(printf("send()failed:%dn",WSAGetLastError();return1;)printf("Send%dbyt

20、esn",ret);ret=recv(sClient,szBuffer,80,0);/*if(ret=0)/Gracefulclosebreak;elseif(ret=SOCKET_ERROR)(printf("recv()failed:%dn",WSAGetLastError();break;*/szBufferret='0'printf("%sn",szBuffer);if(strncmp(szBuffer,"125Transfering.”,strlen("125Transfering.")=

21、0)(if(fpre=fopen(filename,"w")=NULL)(printf("openerrer");return1;)printf("bSendOnly=%dn",bSendOnly);while(!bSendOnly)/读取流并显示ret=recv(sClient,szBuffer,80,0);if(ret=0)/Gracefulclosereturn1;elseif(ret=SOCKET_ERROR)printf("recv()failed:%dnWSAGetLastError();return1;)szB

22、ufferret='0'/printf("%s",szBuffer);if(strncmp(szBuffer,"226Transfer",strlen("226Transfer")=0)break;)if(strncmp(szBuffer,"500Syntaxerror",strlen("500Syntaxerror")=0)break;)fprintf(fpre,"%s",szBuffer);)printf("%sn",szBuffer)

23、;fclose(fpre);)return0;)intputfun(SOCKETsClient,charfilename40)intret;/inti;FILE*fpse;/char*filename;/char*MSG="get0me.txt"charszBuffer80,temp_buffer80;/sprintf(szMessage,"get0","te.txt0");szMessage0='0'strcat(szMessage,"put$");strcat(szMessage,filenam

24、e);ret=send(sClient,szMessage,strlen(szMessage)+1,0);if(ret=0)return0;elseif(ret=SOCKET_ERROR)printf("send()failed:%dn",WSAGetLastError();return1;/printf("Send%dbytesn",ret);/filename="me.txt"printf("filename=%sn",filename);if(fpse=fopen(filename,"r"

25、)=NULL)printf("openerrer");return1;elseprintf("Thefile%sfound,readytotransfer.n",filename);/i=0;while(fgets(temp_buffer,80,fpse)!=NULL)sprintf(szBuffer,"%s",temp_buffer);send(sClient,szBuffer,80,0);sprintf(szBuffer,"226Transfercompleted.rn");ret=send(sClient,s

26、zBuffer,strlen(szBuffer),0);fclose(fpse);return0;intpwdfun(SOCKETsClient)intret;char*MSG="pwd$"charszBuffer160;strcpy(szMessage,MSG);ret=send(sClient,szMessage,strlen(szMessage),0);if(ret=0)return1;elseif(ret=SOCKET_ERROR)(printf("send()failed:%dn",WSAGetLastError();return1;print

27、f("Send%dbytesn”,ret);printf("bSendOnly=%dn”,bSendOnly);while(!bSendOnly)(/读取流并显示ret=recv(sClient,szBuffer,160,0);if(ret=0)/Gracefulclosereturn1;elseif(ret=SOCKET_ERROR)(printf("recv()failed:%dn",WSAGetLastError();return1;szBufferret='0'printf("%sn",szBuffer);if

28、(strncmp(szBuffer,"226Close",strlen("226Close")=0)(break;if(strncmp(szBuffer,"500Syntaxerror",strlen("500Syntaxerror")=0)(break;return0;intcdfun(SOCKETsClient,charpathname40)(intret;szMessage0='0'strcat(szMessage,"cd$");strcat(szMessage,pathn

29、ame);ret=send(sClient,szMessage,strlen(szMessage)+1,0);if(ret=0)return1;elseif(ret=SOCKET_ERROR)(printf("send()failed:%dn",WSAGetLastError();return1;printf("Send%dbytesn",ret);return0;intmdfun(SOCKETsClient,charpathname20)intret;charszBuffer160;/char*MSG="md$"szMessage0

30、='0'strcat(szMessage,"md$");/strcat(szMessage,"");strcat(szMessage,pathname);/strcpy(szMessage,MSG);ret=send(sClient,szMessage,strlen(szMessage)+1,0);if(ret=0)return1;elseif(ret=SOCKET_ERROR)printf("send()failed:%dn",WSAGetLastError();return1;printf("Send%d

31、bytesn",ret);while(!bSendOnly)/读取流并显示ret=recv(sClient,szBuffer,80,0);if(ret=0)/Gracefulclosereturn1;elseif(ret=SOCKET_ERROR)printf("recv()failed:%dn",WSAGetLastError();return1;szBufferret='0'printf("%s",szBuffer);if(strncmp(szBuffer,"226Close",strlen("

32、226Close")=0)break;Syntaxif(strncmp(szBuffer,"500Syntaxerror",strlen("500error")=0)break;return0;intdelfun(SOCKETsClient,charname20)intret;charszBuffer80;szMessage0='0'strcat(szMessage,"del$");strcat(szMessage,name);ret=send(sClient,szMessage,strlen(szMessa

33、ge)+1,0);if(ret=0)return1;elseif(ret=SOCKET_ERROR)printf("send()failed:%dn",WSAGetLastError();return1;printf("Send%dbytesn",ret);while(!bSendOnly)ret=recv(sClient,szBuffer,80,0);if(ret=0)/Gracefulclosereturn1;elseif(ret=SOCKET_ERROR)printf("recv()failed:%dn",WSAGetLastE

34、rror();return1;szBufferret='0'if(strncmp(szBuffer,"delok",strlen("delok")=0)printf("del%sokn",name);break;printf("%s",szBuffer);if(strncmp(szBuffer,"500Syntaxerror",strlen("500Syntaxerror")=0)break;()return0;)intusafun()(puts("

35、");puts("get:取远方的一个文件”);puts("put:传给远方一个文件");puts("pwd:显示远主当前目录”);puts("dir:列出远方当前目录");puts("md:在远方新建文件夹");puts("cd:改变远方当前目录”);puts("?:显示你提供的命令");puts("quit:退出返回");return0;)/intquit()/*sewer.c*/#include<stdio.h>#include<w

36、insock.h>#include<stdlib.h>#pragmacomment;lib,"ws2_32.lib")WSADATAwsd;charsbuffer80,rbuffer80;/sendandreceivebuffersintn,bytes;/countersSOCKETnewsocket,ns_data;structsockaddr_inremoteaddr;/remoteaddr_data;intport_connect=0;/portconnectflagcharpath80="”;charorder100="&quo

37、t;/SOCKETs_data_port;intsy_error=1;/useforindicateSyntaxerror/serverfunctionsintsdirfun(SOCKETnewsocket);intsgetfun(SOCKETnewsocket);intsputfun(SOCKETnewsocket);intspwdfun(SOCKETnewsocket);intscdfun(SOCKETnewsocket);intsmdfun(SOCKETnewsocket);intsdelfun(SOCKETnewsocket);voidHandleError(char*func);/s

38、erverfunctionsend/MAINintmain(intargc,char*argv)(portstructsockaddr_inlocaladdr;/localaddressstructureSOCKETs;/s_data;/welcomesocketandwelcomesocketfordataconnection,andconnectionforconnecttoclientintaddr_inlen;/addresslenghtvariableif(WSAStartup(MAKEWORD(2,2),&wsd)!=0)(WSACleanup();printf("

39、;WSAStartupfailedn");)memset(&localaddr,0,sizeof(localaddr);/clearlocaladdrs=socket(PF_INET,SOCK_STREAM,0);if(s<0)(printf("socketfailedn");localaddr.sin_family=AF_INET;if(argc=2)localaddr.sin_port=htons(u_short)atoi(argv1);elselocaladdr.sin_port=htons(2302);localaddr.sin_addr.s

40、_addr=INADDR_ANY;if(bind(s,(structsockaddr*)(&localaddr),sizeof(localaddr)<0)printf("Bindfailed!n");)/INFINITELOOPwhile(1)/whileloop1/LISTENlisten(s,3);addr_inlen=sizeof(remoteaddr);%d/ACCEPTmainconnection(controlconnection)newsocket=accept(s,(structsockaddr*)(&remoteaddr),&

41、addr_inlen);if(newsocket=INVALID_SOCKET)break;printf("connectedto%satportn",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port);/Respondwithwelcomemessage,FTPclientrequiresthosesprintf(sbuffer,”200Welcomern");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);sprintf(sbuffer,"5

42、30Loginrn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);/INFINITELOOPwhile(1)/whileloop2n=0;sy_error=1;while(1)/whileloop3/RECEIVEbytes=recv(newsocket,&rbuffern,1,0);printf("rbuffer%d=%cn",n,rbuffern);if(bytes<0)|(bytes=0)break;if(rbuffern='$')(rbuffern='0'b

43、reak;if(rbuffern!='r')n+;/endofwhileloop3if(bytes<0)|(bytes=0)break;printf("#TheServerreceives:#'%s'fromclientn",rbuffer);/THEFTPCOMMANDSHERE/LISTif(strncmp(rbuffer,"dir”,3)=0)sdirfun(newsocket);/当前目录/改变目录if(if(strncmp(rbuffer,"pwd”,3)=0)spwdfun(newsocket);(str

44、ncmp(rbuffer,"cd",2)=0)scdfun(newsocket);/GETif(strncmp(rbuffer,"get",3)=0)sgetfun(newsocket);/PUTif(strncmp(rbuffer,"put",3)=0)sputfun(newsocket);)/MDif(strncmp(rbuffer,"md",2)=0)(smdfun(newsocket);)if(strncmp(rbuffer,"del”,3)=0)(sdelfun(newsocket);)/QUI

45、Tif(strncmp(rbuffer,"quit",4)=0)(printf("quitn");sprintf(sbuffer,"221Byebye.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);sy_error=0;break;)/Syntaxerrorif(sy_error=1)(printf("commandunrecognized,non-implemented!n");sprintf(sbuffer,"500Syntaxerror.n

46、");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);)/endofwhileloop2/CLOSECONTROLSOCKETclosesocket(newsocket);printf("disconnectedfrom%satport%d,closecontrolsocket.n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port);/endofwhileloop1/CLOSEWELCOMESOCKETclosesocket(s);printf(&quo

47、t;Welcomesocketsclose");return0;intsdirfun(SOCKETnewsocket)(chartemp_buffer80;printf("Equivalenttodirn");order0='0'strcat(order,"dir");strcat(order,path);strcat(order,">tmp.txt");system(order);FILE*fin;fin=fopen("tmp.txt","r");sprintf

48、(sbuffer,"125Transfering.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);while(fgets(temp_buffer,80,fin)!=NULL)sprintf(sbuffer,"%s",temp_buffer);/if(port_connect=0)send(newsocket,sbuffer,strlen(sbuffer),0);fclose(fin);sprintf(sbuffer,"226Transfercompleted.rn");byte

49、s=send(newsocket,sbuffer,strlen(sbuffer),0);system("deltmp.txt");/CLOSEthens_dataSOCKETordataportSOCKETif(port_connect=0)closesocket(ns_data);sprintf(sbuffer,"226Closethedatasocket.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);ns_data=socket(AF_INET,SOCK_STREAM,0);sy_error

50、=0;return0;intsgetfun(SOCKETnewsocket)printf("RETRmode.rn");inti=4,k=0;charfilename20,temp_buffer80;/identifythefilenamefromrbufferaftertheword"RETR'while(1)/whileloop4/RECEIVEbytes=recv(newsocket,&rbufferi,1,0);printf("rbufferi=%cn",rbufferi);if(bytes<0)|(bytes=0

51、)break;filenamek=rbufferi;if(rbufferi='0')/*endonLF*/filenamek='0'break;if(rbufferi!='r')i+;k+;/*ignoreCR's*/endofwhileloop4order0='0'strcat(order,path);if(strlen(path)>0)strcat(order,"");strcat(order,filename);char*p_filename=order;FILE*fp;if(fp=fope

52、n(p_filename,"r")=NULL)sprintf(sbuffer,"Sorry,cannotopen%s.Pleasetryagain.rn",filename);bytes=send(newsocket,sbuffer,strlen(sbuffer),0);sprintf(sbuffer,"226Transfercompleted.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);return1;elseprintf("Thefile%sfound,rea

53、dytotransfer.n",filename);sprintf(sbuffer,"125Transfering.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);while(fgets(temp_buffer,80,fp)!=NULL)sprintf(sbuffer,"%s",temp_buffer);/if(port_connect=0)send(newsocket,sbuffer,strlen(sbuffer),0);/endofwhilefclose(fp);sprintf(sb

54、uffer,"226Transfercompleted.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);sy_error=0;return0;intsputfun(SOCKETnewsocket)printf("Equivalenttoput.n");inti=4,k=0;charfilename20;/identifythefilenamefromrbufferaftertheword"RETR'while(1)bytes=recv(newsocket,&rbuffer

55、i,1,0);if(bytes<0)|(bytes=0)break;filenamek=rbufferi;if(rbufferi='0')/*endonLF*/filenamek='0'break;if(rbufferi!='r')i+;k+;/*ignoreCR's*/endofwhileorder0='0'strcat(order,path);if(strlen(path)>0)strcat(order,"");strcat(order,filename);printf("fi

56、lename=%s,",order);char*p_filename=order;FILE*fpse;if(fpse=fopen(order,"w")=NULL)printf("openerrer");return1;)else(printf("Thefile%sfound,readytotransfer.n",filename);while(1)(/读取流并显示intret;ret=recv(newsocket,rbuffer,80,0);if(ret=0)/Gracefulclosereturn0;elseif(ret=

57、SOCKET_ERROR)(printf("recv()failed:%dn",WSAGetLastError();return0;)if(strncmp(rbuffer,"226Transfer",strlen("226Transfer")=0)(break;)fprintf(fpse,"%s",rbuffer);)printf("RBUFFER=%s",rbuffer);fclose(fpse);)sy_error=0;return0;)intspwdfun(SOCKETnewsocket)

58、(printf("Equivalenttopwdn");/order0='0'/strcat(order,"dir");/strcat(order,path);/strcat(order,);system("cd>tmp.txt");FILE*fin;fin=fopen("tmp.txt","r+");sprintf(sbuffer,"125Transfering.rn");bytes=send(newsocket,sbuffer,strlen(sbuf

59、fer),0);chartemp_buffer160;while(fgets(temp_buffer,80,fin)!=NULL)(temp_bufferstrlen(temp_buffer)-1='0'printf("temp_buffer=%s”,temp_buffer);/目录判定if(path0!='0')sprintf(sbuffer,"%s%s",temp_buffer,path);elsesprintf(sbuffer,"%s",temp_buffer);/if(port_connect=0)/se

60、nd(ns_data,sbuffer,strlen(sbuffer),0);send(newsocket,sbuffer,strlen(sbuffer),0);fclose(fin);sprintf(sbuffer,"226Transfercompleted.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);system("deltmp.txt");/CLOSEthens_dataSOCKETordataportSOCKETif(port_connect=0)(closesocket(ns_data

61、);sprintf(sbuffer,"226Closethedatasocket.rn");bytes=send(newsocket,sbuffer,strlen(sbuffer),0);ns_data=socket(AF_INET,SOCK_STREAM,0);sy_error=0;return0;intscdfun(SOCKETnewsocket)(inti=3,k=0;charname20,name220;intj,count=0;/pathoverfollowintpathlen;printf("Equivalenttocdn");while(1)(/RECEIVEbytes=recv(newsocket,&rbufferi,1,0);printf("rbufferi=%cn”,rbufferi);printf("bytes=%dn&quo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论