课程设计FTP的设计与实现_第1页
课程设计FTP的设计与实现_第2页
课程设计FTP的设计与实现_第3页
课程设计FTP的设计与实现_第4页
课程设计FTP的设计与实现_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计:FTP的设计与实现一、目的Internet提供了很多类型的网络服务,这些服务实际上都是应用层的服务。FTP服务是基于TCP协议的网络服务。文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议。通过完成 一个文件传送协议 FTP的实现,学会利用已有网络环境设计并实现简单应用层协议,掌握 TCP/IP网络应 用程序基本的设计方法和实现技巧。二、内容和要求每两人一组,分别实现 FTP协议客户端程序和服务器程序。客户端程序具有文件列表、下载文件、上传文件等常用功能。服务器程序支持改变工作目录、文件列 表、下载文件等常用的服务。因为FTP协议比较复杂,为了简单起见,客

2、户端只实现FTP客户端协议的一个子集,总的来说有以下几个功能:连接到指定的FTP服务器;断开和主机的连接;进入子目录;退出子目录;列出服务器当前目录下的所有文件从服务器下载指定的文件到本地(可以同时指定多个文件连续下载 )从本地上传指定的文件到服务器实现以上几个功能时会涉及到下面的几个FTP命令:USER usernamePASS passwordCWD directory-namePORT host-portTYPE A or IRETRSTORLIST directory用户界面应该能够为程序输入下面的信息:服务器主机名用户名、口令数据的传送类型要进入的服务器目录要下载的远程文件名要上载的

3、本地文件名和远程文件名同时,界面也为用户输出以下的信息:FTP服务器上的文件和目录列表从服务器返回的应答 使用Socket进彳f Client/Server程序设计的一般连接过程是这样的: Server端Listen(监听)某个端口是否有连 接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept (接受)消息。一 个连接就建立起来了。 Server端和Client端都可以通过 Send, Write等方法与对方通信。对于一个功能齐全的 Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:(1) 创建 Socket;

4、(2) 打开连接到Socket的输入/出流;(3)按照一定的协议对 Socket进行读/写操作;(4)关闭 Socket.第三步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同 /*dient.c*/ #include <winsock2.h> #include <stdio.h>#include <stdlib.h>#pragma comment (lib ,"ws2_32.lib")#define DEFAULT_PORT 2302#define DEFAULT_BUFFER 2048#define

5、DEFAULT_MESSAGE "This is a test of the emergency broadcasting system char szServerip128, / Server to connect toszMessage1024; / Message to send to severint iPort = DEFAULT_PORT; / Port on server to connect to/DWORD dwCount = DEFAULT_COUNT; / Number of times to send messageBOOL bSendOnly = FALSE

6、; / Send data only; don't receive int dirfun();int getfun();int putfun();int pwdfun();int cdfun();int mdfun();int delfun();int usafun();void usage()(printf("usage: client -p:x -s:IP -n:x -onn");printf("-p:xRemote port to send ton");printf("-s:IPServer's IP address or

7、 hostnamen");printf("-n:xNumber of times to send messagen");printf("-oSend messages only; don't receiven");ExitProcess(l);void ValidateArgs( int argc, char *argv)(inti;for (i = 1; i < argc; i+)(if (argvi0 ='-') | (argvi0 = '/')(switch (tolower(argvi1)(

8、case 'p':/ Remote portif (strlen(argvi) > 3)iPort = atoi(&argvi3);break ;case 's':/ Serverif (strlen(argvi) > 3)strcpy(szServerip, &argvi3);break ;case 'n':/ Number of times to send messageif (strlen(argvi) > 3)/dwCount = atol(&argvi3);break ;case 'o&

9、#39;:/ Only send message; don't receivebSendOnly = TRUE;break ;default :usage();break ;)int main( int argc, char *argv)(WSADATA wsd;SOCKET sClient;char szBufferDEFAULT_BUFFER;int ret;/unsigned inti;/int j;struct sockaddr_in server;struct hostent *host = NULL;char choice5,choice240;/ Parse the co

10、mmand line and load Winsock/argv1="-s:"strcpy(szServerip, &argv13);/ValidateArgs(argc, argv);if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)(printf("Failed to load Winsock library!n");return 1;)/strcpy(szMessage, DEFAULT_MESSAGE);/ Create the socket, and attempt to con

11、nect to the server/sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sClient = INVALID_SOCKET)(printf("socket() failed: %dn", WSAGetLastError();return 1;)server.sin_family = AF_INET;server.sin_port = htons(iPort);printf("server.sin_port=%un",server.sin_port);server.sin_addr

12、.s_addr = inet_addr(szServerip);/ If the supplied server address wasn't in the form/ "aaa.bbb.ccc.ddd" it's a hostname, so try to resolve it/if (server.sin_addr.s_addr = INADDR_NONE)(host = gethostbyname(szServerip);if (host = NULL)(printf("Unable to resolve server: %sn",

13、 szServerip);return 1;CopyMemory(&server.sin_addr, host->h_addr_list0, host->h_length);if (connect(sClient, ( struct sockaddr *)&server, sizeof (server) = SOCKET_ERROR)(printf("connect() failed: %dn", WSAGetLastError();return 1;/显示接通信息/for(j=0;j<2;j+)/(ret = recv(sClient,

14、szBuffer, DEFAULT_BUFFER, 0);if (ret = 0)/ Graceful closereturn 0;else if (ret = SOCKET_ERROR)(printf("recv() failed: %dn", WSAGetLastError();return 0;szBufferret = '0'printf("%sn",szBuffer);if(ret<15)(ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if (ret = 0)/ Grac

15、eful closereturn 0;else if (ret = SOCKET_ERROR) (/printf("recv() failed: %dn", WSAGetLastError(); return 0;szBufferret = '0'printf("%sn",szBuffer);)/printf("DEFAULT_BUFFER=%dn",DEFAULT_BUFFER);)while (1)puts("");printf("ftp> ");scanf("

16、;%s", choice);if (strncmp(choice,"dir",3)=0|strncmp(choice,"DIR",2)=0)dirfun(sClient);continue ;)else if (strncmp(choice,"pwd",3)=0|strncmp(choice,"PWD",3)=0) pwdfun(sClient);continue ;)else if (strncmp(choice,"?",1)=0)usafun(sClient);continue ;

17、)else if (strncmp(choice,"quit",4)=0|strncmp(choice,"QUIT",2)=0) break ;)scanf("%s", choice2);if (strncmp(choice,"get",3)=0|strncmp(choice,"GET",3)=0)getfun(sClient,choice2);continue ;)else if (strncmp(choice,"put",3)=0|strncmp(choice,"

18、;PUT",3)=0)putfun(sClient,choice2);continue ;)else if (strncmp(choice,"cd",2)=0|strncmp(choice,"CD",2)=0)(cdfun(sClient,choice2);continue ;else if (strncmp(choice,"md",2)=0|strncmp(choice,"MD",2)=0)(mdfun(sClient,choice2);continue ;else if (strncmp(choice

19、,"del",3)=0|strncmp(choice,"DEL",3)=0) (delfun(sClient,choice2);continue ;/elseputs("输入错误,请重新输入");fflush(stdin);fflush(stdin);printf("n");printf("n");closesocket(sClient);WSACleanup();return 0;int dirfun(SOCKET sClient)(int ret;char *MSG="dir$&q

20、uot; char szBuffer80;strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret = 0)return 1;else if (ret = SOCKET_ERROR)(printf("send() failed: %dn", WSAGetLastError();return 1;/printf("Send %d bytesn", ret);Z/printf("bSendOnly=%dn",bSendOnly);

21、 while (!bSendOnly)(/读取流并显不Z/ret = recv(sClient, szBuffer, 80, 0);Z/printf("%s",szBuffer);ret = recv(sClient, szBuffer, 80, 0);if (ret = 0)/ Graceful closereturn 1;else if (ret = SOCKET_ERROR)(printf("recv() failed: %dn", WSAGetLastError();return 1;)szBufferret = '0'if(st

22、rncmp(szBuffer,"226 Close",strlen("226 Close")=0)(break ;)printf("%s",szBuffer);if (strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error")=0) (break ;)return 0;)int getfun(SOCKET sClient, char 40)(int ret;FILE *fpre;char szBuffer80;szMessage0

23、='0'strcat(szMessage, "get$");/strcat(szMessage, "");strcat(szMessage,);/printf("MSG4=%cn",szMessage4);/szMessage0='g'szMessage1='e'szMessage2='t'/szMessage4='m'szMessage5='e'szMessage6='.'szMessage7='t'/sz

24、Message8='x'szMessage9='t'szMessage10='0'ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret = 0)return 1;else if (ret = SOCKET_ERROR)printf("send() failed: %dn", WSAGetLastError();return 1;printf("Send %d bytesn", ret);ret = recv(sClient, szBuf

25、fer, 80, 0);/*if (ret = 0)/ Graceful closebreak;else if (ret = SOCKET_ERROR)printf("recv() failed: %dn", WSAGetLastError();break;*/szBufferret = '0'printf("%sn",szBuffer);if (strncmp( szBuffer,"125 Transfering",strlen("125 Transfering.") )=0) if ( (fpr

26、e=fopen(,"w") = NULL )printf("open errer");return 1;printf("bSendOnly=%dn",bSendOnly);while (!bSendOnly)/读取流并显不ret = recv(sClient, szBuffer, 80, 0);if (ret = 0)/ Graceful closereturn 1;else if (ret = SOCKET_ERROR)printf("recv() failed: %dn", WSAGetLastError();

27、return 1;szBufferret = '0'/printf("%s",szBuffer);if (strncmp(szBuffer,"226 Transfer",strlen("226 Transfer")=0)(break;)if (strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error")=0) (break;)fprintf(fpre,"%s",szBuffer);)printf(

28、"%sn",szBuffer);fclose(fpre);)return 0;)int putfun(SOCKET sClient, char 40)(int ret; /int i;FILE *fpse; /char *;/char *MSG="get0me.txt"char szBuffer80,temp_buffer80;/sprintf(szMessage, "get0","te.txt0");szMessage0='0'strcat(szMessage, "put$")

29、;strcat(szMessage,);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret = 0)return 0;else if (ret = SOCKET_ERROR)(printf("send() failed: %dn", WSAGetLastError();return 1;)/printf("Send %d bytesn", ret);/"me.txt"printf("n",);if ( (fpse=fopen(,"r

30、") = NULL )(printf("open errer");return 1;)else(printf("The found,ready to transfer.n",);/i=0;while (fgets(temp_buffer,80,fpse)!=NULL)(sprintf(szBuffer,"%s",temp_buffer);send(sClient, szBuffer, 80, 0);sprintf(szBuffer, "226 Transfer completed. rn");ret =

31、send(sClient, szBuffer, strlen(szBuffer), 0);fclose(fpse);return 0;int pwdfun(SOCKET sClient)(int ret;char *MSG="pwd$”;char szBuffer160;strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret = 0)return 1;else if (ret = SOCKET_ERROR)(printf("send() failed: %dn&q

32、uot;, WSAGetLastError();return 1;printf("Send %d bytesn", ret);printf("bSendOnly=%dn",bSendOnly);while (!bSendOnly)(/读取流并显不ret = recv(sClient, szBuffer, 160, 0);if (ret = 0)/ Graceful closereturn 1;else if (ret = SOCKET_ERROR)(printf("recv() failed: %dn", WSAGetLastErro

33、r();return 1;szBufferret = '0'printf("%sn",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close")=0)(break;)if (strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error")=0) (break;)return 0;)int cdfun(SOCKET sClient, char pathname

34、40)(int ret;szMessage0='0'strcat(szMessage, "cd$");strcat(szMessage,pathname);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret = 0)return 1;else if (ret = SOCKET_ERROR)(printf("send() failed: %dn", WSAGetLastError();return 1;)printf("Send %d bytesn"

35、;, ret);return 0;)int mdfun(SOCKET sClient, char pathname20)(int ret; char szBuffer160;/char *MSG="md$"szMessage0='0'strcat(szMessage, "md$");strcat(szMessage, "");strcat(szMessage,pathname);/strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage

36、)+1,0);if (ret = 0)return 1;else if (ret = SOCKET_ERROR)(printf("send() failed: %dn", WSAGetLastError();return 1;printf("Send %d bytesn", ret);while (!bSendOnly)/读取流并显不ret = recv(sClient, szBuffer, 80, 0);if (ret = 0)/ Graceful closereturn 1;else if (ret = SOCKET_ERROR)printf(&qu

37、ot;recv() failed: %dn", WSAGetLastError();return 1;szBufferret = '0'printf("%s",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close")=0) break ;if (strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error")=0) break ; return

38、0;int delfun(SOCKET sClient, char name20)int ret; char szBuffer80;szMessage0='0'strcat(szMessage, "del$");strcat(szMessage,name);ret = send(sClient, szMessage, strlen(szMessage)+1,0);if (ret = 0)return 1;else if (ret = SOCKET_ERROR)printf("send() failed: %dn", WSAGetLastE

39、rror();return 1;)printf("Send %d bytesn", ret);while (!bSendOnly)(ret = recv(sClient, szBuffer, 80, 0);if (ret = 0)/ Graceful closereturn 1;else if (ret = SOCKET_ERROR) (printf("recv() failed: %dn", WSAGetLastError();return 1;)szBufferret = '0'if (strncmp(szBuffer,"d

40、el ok",strlen("del ok")=0)(printf("del %s okn",name);break ;)printf("%s",szBuffer);if (strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error")=0) (break ;)return 0;)int usafun()(puts("");puts("get :取远方的一个文件");puts(&quo

41、t;put :传给远方一个文件");puts("pwd :显示远主当前目录"); puts("dir :列出远方当前目录"); puts("md :在远方新建文件夹");puts("cd :改变远方当前目录");puts(" ?:显示你提供的命令");puts("quit :退出返回");return 0;)/int quit()/*server.c*/ #include <stdio.h>#include <winsock.h>#inclu

42、de <stdlib.h>#pragma comment(lib ,"ws2_32.lib")WSADATA wsd;char sbuffer80,rbuffer80; /send and receive buffers int n,bytes; /countersSOCKET newsocket,ns_data;struct sockaddr_in remoteaddr; /remoteaddr_data;int port_connect=0; /port connect flagchar path80=""char order100=&q

43、uot;"/SOCKET s_data_port;int sy_error=1; / use for indicate Syntax error/server functionsint sdirfun(SOCKET newsocket);int sgetfun(SOCKET newsocket);int sputfun(SOCKET newsocket);int spwdfun(SOCKET newsocket);int scdfun(SOCKET newsocket);int smdfun(SOCKET newsocket);int sdelfun(SOCKET newsocket

44、);void HandleError( char *func);/server functions end/MAINint main( int argc, char *argv口)struct sockaddr_in localaddr; /local address structureSOCKETs; /s_data;/welcome socket and welcome socket for data connection,and port connection for connect to client int addr_inlen; /address lenght variable i

45、f (WSAStartup(MAKEWORD(2,2), &wsd) != 0) WSACleanup();printf("WSAStartup failedn");memset(&localaddr,0, sizeof (localaddr); /clear localaddrs = socket(PF_INET, SOCK_STREAM, 0);if (s <0)printf("socket failedn");localaddr.sin_family = AF_INET;if (argc = 2)localaddr.sin_p

46、ort = htons(u_short)atoi(argv1); elselocaladdr.sin_port = htons(2302); localaddr.sin_addr.s_addr = INADDR_ANY;if (bind(s,( struct sockaddr *)(&localaddr), sizeof (localaddr) < 0) printf("Bind failed!n"); )/INFINITE LOOP while (1) / while loop 1/LISTENlisten(s,3);addr_inlen = sizeof

47、(remoteaddr); /ACCEPT main connection (control connection) newsocket = accept(s,( struct sockaddr *)(&remoteaddr),&addr_inlen); if (newsocket = INVALID_SOCKET) break ;%dprintf("connectedto%s at portn",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port); /Respond with welcome m

48、essage, requires those sprintf(sbuffer,"200 Welcome rn"); bytes = send(newsocket, sbuffer, strlen(sbuffer), 0); sprintf(sbuffer,"530 Log in rn"); bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);/INFINITE LOOPwhile (1) / while loop 2n = 0; sy_error=1; while (1)/ while loop 3

49、/RECEIVE bytes = recv(newsocket, &rbuffern, 1,0); printf("rbuffer%d=%cn",n,rbuffern);if (bytes < 0) | (bytes = 0) break;if (rbuffern = '$')(rbuffern = '0' break;if (rbuffern != 'r') n+;/ end of while loop 3if (bytes < 0) | (bytes = 0) break;printf("#T

50、he Server receives:# '%s' from client n", rbuffer);/THE DS HERE/LISTif (strncmp(rbuffer,"dir",3)=0)( sdirfun(newsocket);/当前目录if (strncmp(rbuffer,"pwd",3)=0)(spwdfun(newsocket);/改变目录if (strncmp(rbuffer,"cd",2)=0)(scdfun(newsocket);/GETif (strncmp(rbuffer,&qu

51、ot;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);)/QUITif (strncmp(rbuffer,"quit",4)=0)(printf("quit 'n

52、");sprintf(sbuffer, "221 Bye bye rn");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sy_error=0;break;)/Syntax errorif (sy_error=1)(printf("command unrecognized, non-implemented!n");sprintf(sbuffer, "500 Syntax error. n");bytes = send(newsocket, sbuffer, strl

53、en(sbuffer), 0);) / end of while loop 2/CLOSE CONTROL SOCKETclosesocket(newsocket);printf("disconnectedfrom %s at port %d, close controlsocket.n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port); / end of while loop 1/CLOSE WELCOME SOCKETclosesocket(s);printf("Welcome sockets

54、close");return 0;int sdirfun(SOCKET newsocket)(char temp_buffer80;printf("Equivalent to dir n");order0='0'strcat(order,"dir ");strcat(order,path);strcat(order," >tmp.txt");system(order);FILE *fin;fin=fopen("tmp.txt","r");sprintf(sbuff

55、er, "125 Transfering. 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, "226 Transfer completed. rn

56、");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);system("del tmp.txt");/CLOSE the ns_data SOCKET or data port SOCKETif (port_connect=0) closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket. rn");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data =

57、 socket(AF_INET, SOCK_STREAM, 0);sy_error=0;return 0;int sgetfun(SOCKET newsocket)printf("RETR mode.rn");int i=4,k=0;char 20,temp_buffer80;/ identify the from rbuffer after the word "RETR " while (1)/ while loop 4/RECEIVEbytes = recv(newsocket, &rbufferi, 1, 0);printf("r

58、bufferi=%cn",rbufferi);if (bytes < 0) | (bytes = 0) break;k=rbufferi;if (rbufferi = "0") /*end on LF*/k = '0"break;if (rbufferi != "r')i+;k+; /*ignore CR's*/ / end of while loop 4order0='0"strcat(order,path);if (strlen(path)>0) strcat(order,"&

59、quot;);strcat(order,);char *p_;FILE *fp;if ( (fp=fopen(p_,"r") = NULL )sprintf(sbuffer, "Sorry, cannot open %s. Please try again.rn",);bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer, "226 Transfer completed. rn");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);return 1; elseprintf("The found,ready to transfer.n",);sprintf(sbuffer, "125 Transfering. rn");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);while (fgets(temp_buffer,80,fp)!=NULL) sprintf(

温馨提示

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

评论

0/150

提交评论