文件传输协议的(C语言)实现_第1页
文件传输协议的(C语言)实现_第2页
文件传输协议的(C语言)实现_第3页
文件传输协议的(C语言)实现_第4页
文件传输协议的(C语言)实现_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

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

2、现FTP客户端协议的一个子集,总的来说有以下几个功能:l 连接到指定的FTP服务器;l 断开和主机的连接;l 进入子目录;l 退出子目录;l 列出服务器当前目录下的所有文件l 从服务器下载指定的文件到本地(可以同时指定多个文件连续下载)l 从本地上传指定的文件到服务器实现以上几个功能时会涉及到下面的几个FTP命令:l USER usernamel PASS passwordl CWD directory-namel PORT host-portl TYPE A or I l RETR filenamel STOR filenamel LIST directory用户界面应该能够为程序输入下面的

3、信息:l 服务器主机名l 用户名、口令l 数据的传送类型l 要进入的服务器目录l 要下载的远程文件名 l 要上载的本地文件名和远程文件名 同时,界面也为用户输出以下的信息:l FTP服务器上的文件和目录列表l 从服务器返回的应答使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。 对于一个功能

4、齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤: (1) 创建Socket; (2) 打开连接到Socket的输入/出流; (3) 按照一定的协议对Socket进行读/写操作; (4) 关闭Socket. 第三步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同。 /*client.c*/#include #include #include #pragma comment(lib,ws2_32.lib)#define DEFAULT_PORT 2302#define DEFAULT_BUFFER 2048#define DEFAULT

5、_MESSAGE This is a test of the emergency broadcasting systemcharszServerip128, / Server to connect to szMessage1024; / Message to send to severint iPort = DEFAULT_PORT;/ Port on server to connect to/DWORD dwCount = DEFAULT_COUNT; / Number of times to send messageBOOLbSendOnly = FALSE; / Send data on

6、ly; dont receiveint 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:x Remote port to send ton); printf( -s:IP Servers IP address or hostnamen); printf( -n:x Number of times to send m

7、essagen); printf( -o Send messages only; dont receiven); ExitProcess(1);void ValidateArgs(int argc, char *argv) int i; for(i = 1; i 3) iPort = atoi(&argvi3); break; case s: / Server if (strlen(argvi) 3) strcpy(szServerip, &argvi3); break; case n: / Number of times to send message if (strlen(argvi) 3

8、) /dwCount = atol(&argvi3); break;case o: / Only send message; dont receive bSendOnly = TRUE; break; default: usage(); break; int main(int argc, char *argv) WSADATA wsd; SOCKET sClient; char szBufferDEFAULT_BUFFER; int ret; /unsigned int i; /int j; struct sockaddr_in server; struct hostent *host = N

9、ULL; char choice5,choice240; / Parse the command 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 socke

10、t, and attempt to connect 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_

11、addr.s_addr = inet_addr(szServerip);/ / If the supplied server address wasnt in the form / aaa.bbb.ccc.ddd its 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, szServerip); return 1;

12、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;j2;j+) / ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0); if (ret = 0) / Gr

13、aceful close return 0; else if (ret = SOCKET_ERROR) printf(recv() failed: %dn, WSAGetLastError(); return 0; szBufferret = 0; printf(%sn,szBuffer); if(ret ); scanf(%s, choice); if(strncmp(choice,dir,3)=0|strncmp(choice,DIR,2)=0) dirfun(sClient); continue; else if(strncmp(choice,pwd,3)=0|strncmp(choic

14、e,PWD,3)=0) pwdfun(sClient); continue; else if(strncmp(choice,?,1)=0) usafun(sClient); continue; 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)=

15、0|strncmp(choice,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,del,3)=0|strncmp(choice,DEL,3)=0) del

16、fun(sClient,choice2); continue; /else puts(输入错误,请重新输入); fflush(stdin); fflush(stdin); printf(n); printf(n); closesocket(sClient); WSACleanup(); return 0;int dirfun(SOCKET sClient) int ret; char *MSG=dir$;char szBuffer80; strcpy(szMessage, MSG); ret = send(sClient, szMessage, strlen(szMessage), 0); i

17、f (ret = 0) return 1; else if (ret = SOCKET_ERROR) printf(send() failed: %dn, WSAGetLastError(); return 1; /printf(Send %d bytesn, ret); /printf(bSendOnly=%dn,bSendOnly); while(!bSendOnly) /读取流并显示 /ret = recv(sClient, szBuffer, 80, 0); /printf(%s,szBuffer); ret = recv(sClient, szBuffer, 80, 0); if (

18、ret = 0) / Graceful close return 1; else if (ret = SOCKET_ERROR) printf(recv() failed: %dn, WSAGetLastError(); return 1; szBufferret = 0; if(strncmp(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;in

19、t getfun(SOCKET sClient,char filename40) int ret; FILE *fpre; char szBuffer80; szMessage0=0; strcat(szMessage, get$); /strcat(szMessage, ); strcat(szMessage,filename); /printf(MSG4=%cn,szMessage4); /szMessage0=g;szMessage1=e;szMessage2=t; / /szMessage4=m;szMessage5=e;szMessage6=.;szMessage7=t; / /sz

20、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, szBuffer, 80, 0); /*if (ret = 0) / Graceful clos

21、e break; 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( (fpre=fopen(filename,w) = NULL ) printf(open errer); return 1; printf(bSendOnly=%dn,bSendOnly);

22、 while(!bSendOnly) /读取流并显示 ret = recv(sClient, szBuffer, 80, 0); if (ret = 0) / Graceful close return 1; else if (ret = SOCKET_ERROR) printf(recv() failed: %dn, WSAGetLastError(); return 1; szBufferret = 0; /printf(%s,szBuffer); if(strncmp(szBuffer,226 Transfer,strlen(226 Transfer)=0) break; if(strn

23、cmp(szBuffer,500 Syntax error,strlen(500 Syntax error)=0) break; fprintf(fpre,%s,szBuffer); printf(%sn,szBuffer); fclose(fpre); return 0;int putfun(SOCKET sClient,char filename40) int ret;/int i; FILE *fpse;/char *filename; /char *MSG=get0me.txt; char szBuffer80,temp_buffer80; /sprintf(szMessage, ge

24、t0,te.txt0); szMessage0=0; strcat(szMessage, put$); strcat(szMessage,filename); 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); /filename=me.txt; printf(f

25、ilename=%sn,filename); if( (fpse=fopen(filename,r) = NULL ) printf(open errer); return 1; else printf(The file %s found,ready to transfer.n,filename); /i=0; while (fgets(temp_buffer,80,fpse)!=NULL) sprintf(szBuffer,%s,temp_buffer); send(sClient, szBuffer, 80, 0); sprintf(szBuffer, 226 Transfer compl

26、eted. rn); ret = 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()

27、failed: %dn, WSAGetLastError(); return 1; printf(Send %d bytesn, ret); printf(bSendOnly=%dn,bSendOnly); while(!bSendOnly) /读取流并显示 ret = recv(sClient, szBuffer, 160, 0); if (ret = 0) / Graceful close return 1; else if (ret = SOCKET_ERROR) printf(recv() failed: %dn, WSAGetLastError(); return 1; szBuff

28、erret = 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 pathname40) int ret; szMessage0=0; strcat(szMessage, cd$); strcat(szMessage,pathname); ret = send(

29、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); return 0;int mdfun(SOCKET sClient,char pathname20) int ret;char szBuffer160; /char *MSG=md$; szMessage0=0; strcat(szMe

30、ssage, md$); /strcat(szMessage, ); strcat(szMessage,pathname); /strcpy(szMessage, MSG); 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); while(!bSendOnly) /

31、读取流并显示 ret = recv(sClient, szBuffer, 80, 0); if (ret = 0) / Graceful close return 1; else if (ret = SOCKET_ERROR) printf(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 err

32、or,strlen(500 Syntax error)=0) break; return 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() fail

33、ed: %dn, WSAGetLastError(); return 1; printf(Send %d bytesn, ret); while(!bSendOnly) ret = recv(sClient, szBuffer, 80, 0); if (ret = 0) / Graceful close return 1; else if (ret = SOCKET_ERROR) printf(recv() failed: %dn, WSAGetLastError(); return 1; szBufferret = 0; if(strncmp(szBuffer,del ok,strlen(d

34、el 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(put:传给远方一个文件); puts(pwd:显示远主当前目录); puts(dir:列出远方当前目录); puts(md :在远方新建文件夹); puts(cd :改变远方当前目录); puts(? :显示你提供的

35、命令); puts(quit :退出返回); return 0;/int quit()/*server.c*/#include #include #include #pragma comment(lib,ws2_32.lib)WSADATA wsd;char sbuffer80,rbuffer80;/send and receive buffersint n,bytes;/countersSOCKET newsocket,ns_data;struct sockaddr_in remoteaddr; /remoteaddr_data;int port_connect=0;/port connect flagchar path80=;char order100=;/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 newsoc

温馨提示

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

评论

0/150

提交评论