课程设计:FTP的设计与实现一、目的Internet提供了很多类型的网络服务, 这些服务实际上都是应用层的服务 FTP服务是基于TCP协议的网络服务文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议通过完成 一个文件传送协议 FTP的实现,学会利用已有网络环境设计并实现简单应用层协议,掌握 TCP/IP网络应 用程序基本的设计方法和实现技巧二、内容和要求每两人一组,分别实现 FTP协议客户端程序和服务器程序客户端程序具有文件列表、下载文件、上传文件等常用功能服务器程序支持改变工作目录、文件列 表、下载文件等常用的服务因为FTP协议比较复杂,为了简单起见,客户端只实现 FTP客户端协议的一个子集,总的来说有以下几个功能:连接到指定的FTP服务器;断开和主机的连接;进入子目录;退出子目录;列出服务器当前目录下的所有文件从服务器下载指定的文件到本地(可以同时指定多个文件连续下载 )从本地上传指定的文件到服务器实现以上几个功能时会涉及到下面的几个 FTP命令:USER usernamePASS passwordCWD directory-namePORT host-portTYPE A or IRETRSTORLIST directory用户界面应该能够为程序输入下面的信息:服务器主机名用户名、口令数据的传送类型要进入的服务器目录要下载的远程文件名要上载的本地文件名和远程文件名同时,界面也为用户输出以下的信息:FTP服务器上的文件和目录列表从服务器返回的应答 使用Socket进彳f Client/Server程序设计的一般连接过程是这样的: Server端Listen(监听)某个端口是否有连 接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept (接受)消息。
一 个连接就建立起来了 Server端和Client端都可以通过 Send, Write等方法与对方通信对于一个功能齐全的 Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:(1) 创建 Socket;(2) 打开连接到Socket的输入/出流;(3)按照一定的协议对 Socket进行读/写操作;(4)关闭 Socket.第三步是程序员用来调用 Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同 /****************dient.c****************/ #include #include #include #pragma comment (lib ,"ws2_32.lib")#define DEFAULT_PORT 2302#define DEFAULT_BUFFER 2048#define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system char szServerip[128], // Server to connect toszMessage[1024]; // 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; // 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] [-o]\n\n");printf("-p:xRemote port to send to\n");printf("-s:IPServer's IP address or hostname\n");printf("-n:xNumber of times to send message\n");printf("-oSend messages only; don't receive\n");ExitProcess(l);}void ValidateArgs( int argc, char **argv)(int i;for (i = 1; i < argc; i++)(if ((argv[i][0] =='-') || (argv[i][0] == '/'))(switch (tolower(argv[i][1]))(case 'p': // Remote portif (strlen(argv[i]) > 3)iPort = atoi(&argv[i][3]);break ;case 's': // Serverif (strlen(argv[i]) > 3)strcpy(szServerip, &argv[i][3]);break ;case 'n': // Number of times to send messageif (strlen(argv[i]) > 3)//dwCount = atol(&argv[i][3]);break ;case 'o': // Only send message; don't receivebSendOnly = TRUE;break ;default :usage();break ;))))int main( int argc, char **argv)(WSADATA wsd;SOCKET sClient;char szBuffer[DEFAULT_BUFFER];int ret;//unsigned int i;//int j;struct sockaddr_in server;struct hostent *host = NULL;char choice[5],choice2[40];// Parse the command line and load Winsock//argv[1]="-s:127.0.0.1";strcpy(szServerip, &argv[1][3]);//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 connect to the server//sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sClient == INVALID_SOCKET)(printf("socket() failed: %d\n", WSAGetLastError());return 1;)server.sin_family = AF_INET;server.sin_port = htons(iPort);printf("server.sin_port=%u\n",server.sin_port);server.sin_addr.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: %s\n", szServerip);return 1;}CopyMemory(&server.sin_addr, host->h_addr_list[0], host->h_length);}if (connect(sClient, ( struct sockaddr *)&server, sizeof (server)) == SOCKET_ERROR)(printf("connect() failed: %d\n", WSAGetLastError());return 1;}//显示接通信息//////for(j=0;j<2;j++)//(ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR)(printf("recv() failed: %d\n", WSAGetLastError());return 0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(ret<15)(ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR) (//printf("recv() failed: %d\n", WSAGetLastError()); return 0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);)//printf("DEFAULT_BUFFER=%d\n",DEFAULT_BUFFER);)while (1){puts(" ");printf("ftp> ");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(choice,"PWD",3)==0) {pwdfun(sClient);continue ;)else if (strncmp(choice,"?",1)==0){usafun(sClient);continue ;)。