基于WINSOCK的FTP客户端的实现

合集下载

用Socket编程实现FTP

用Socket编程实现FTP
6、多路复用——select() 功能:用来检测一个或多个套接字状态。
格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout); 参数:readfds:指向要做读检测的指针 writefds:指向要做写检测的指针 exceptfds:指向要检测是否出错的指针 timeout:最大等待时间
连接管理:
数据连接有 3 大用途: (1) 从客户向服务器发送一个文件 (2) 从服务器向客户发送一个文件 (3) 从服务器向客户发送文件或目录列表。
每一个数据连接对传输一个文件或目录序列都要建立一个新的连接。 (1) 客户发出命令要求建立数据连接 (2) 客户在客户主机上未数据连接选择一个固定的端口号 (3) 客户使用 PORT 命令从控制连接上把端口号发给服务器。 (4) 服务器在控制连接上接收端口号,并向客户端主机上的端口发出主动打开,服务器的数据连接 使用端口 21。
服务器端程序则持续的监听网络。当接受到客户端的 Socket ,服务器程序提供相应的服务。网络通 信模块使用 POP3 控件来实现客户端与服务器的信息交流。
函数功能和流程如下:(1)首先创建一个 CFtpclient 的类的实例。 (2)用 LogOnToServer()函数登录到指定的 FTP 服务器,允许非匿名用户和匿名两种登录方式,默认 的端口为 21. (3)使用 MoveFile()函数来上传下载数据文件,其中第一个参数是本地地址,第二个参数是远程地 址,文件传输选用二进制模式。注意,文件传输使用同步模式。 (4)可以使用 Ftpcommand()函数来执行 FTP 指令,包括常用的“CWD/home/mydir”来改变远程服务 器上的地址,并处理服务器返回的应答。当这种方式不适用的时候,还可以使用 WriteStr()函数和 ReadStr() 函数向远程服务器发送指令,并自己解释返回的应答。 (5)当所有的文件传输完成之后,使用 LogOffServer 函数来断开与远程服务器的连接。

FTP服务器C++代码实现

FTP服务器C++代码实现

准备工作VC6.0添加ws2_32.lib到工程,如下图操作:1.首先添加winsock库到工程2.添加lib库文件3.添加ws2_32.lib切记用空格隔开4.点击OK即可源代码:FTP_Client:#pragma comment( lib, "ws2_32.lib" )#include <Winsock2.h>#include <iostream.h>#include <stdio.h>#include <fstream.h>#include <string.h>#include <windows.h>#define TRAN_SUCCESS 1 //传输成功#define SOCK_WSA_ERR (-1) //启动winsock库失败#define SOCK_CRSOCK_ERR (-2) //创建套接字失败#define SOCK_BIND_ERR (-3) //绑定端口失败#define SOCK_LISTEN_ERR (-4) //监听失败#define SOCK_ACCEPT_ERR (-5) //等待连接失败#define SOCK_SEND_ERR (-6) //发送数据失败#define SOCK_CLOSE_ERR (-7) //关闭SOCKET失败#define SOCK_RECVE_ERR (-8) //接受数据失败#define SOCK_CONNECT_ERR (-10)#define FILE_ERR (-9) //文件错误#define Other_ERR (0) //其他不明原因#define SVR_PORT 6000 //服务器端口#define SEND_BUFFER_SIZE 4096 //每次发送大小#define RECV_BUFFER_SIZE 4096 //每次发送大小struct Fileinfo{char fileName[50]; //文件名int fileBlock; //文件分块大小int BlockNum; //文件块数量unsigned long fileSize; //文件总大小};int RecevData( SOCKET s );int Client(char* fileName);void PrintReturn(int nRet);int Client( char* strIP)//int Client()//int Client(char* fileName){int nResult = 0;//1、启动Winsock:对Winsock DLL进行初始化,协商Winsock的版本支持并分配必要的资源。

北京理工大学-计算机网络实践-FTP客户端实验报告

北京理工大学-计算机网络实践-FTP客户端实验报告

实验五 FTP客户端程序1.实验目的文件传送协议FTP是Internet中广泛使用的服务协议之一,FTP协议是客户/服务器之间进行文件传递的协议。

●理解FTP协议的工作原理●掌握FTP客户程序的编程方法●理解在FTP传输过程中建立的两个连接2.实验内容利用WinSock编程接口编写FTP客户程序,在用户界面中给出必要的FTP 服务器信息:FTP服务器的IP地址、用户名、口令等,通过FTP协议实现指定文件的上载和下载操作。

3.实验环境程序运行环境为以太网,采用TCP/IP协议栈,网络操作系统为Windows,具有Internet连接能力。

程序开发环境为vs2012。

4.实验步骤步骤1 需求分析FTP客户程序功能为:(1) FTP客户程序首先显示用户界面,可以指定FTP服务器的地址、用户名和口令等信息(2)通过FTP协议接收FTP服务器的当前目录列表,并显示本地和远程目录列表信息(3)可以实现本地和远程目录的切换(4)可以实现文件的上载和下载操作步骤2 FTP客户程序开发用Visual C++编写FTP客户程序,利用WinSock编程接口实现FTP协议通信。

FTP客户程序首先显示用户界面,使用户可以指定FTP服务器和用户、口令信息(可以采用匿名方式),点击连接按钮后,向FTP服务器的TCP 21号端口建立TCP连接,在控制连接上发送FTP命令,首先获得本地和远程系统的目录列表并显示,可以进行目录切换等操作,指定上、下载的文件建立数据连接进行文件传送。

步骤3 编译和执行程序将FTP客户程序编译、连接成执行程序,运行FTP客户程序。

填写校园网的FTP服务器IP和用户、口令信息,进行各种FTP操作(文件上载、下载)。

5.具体实现(1)数据结构分析定义FileItem结构来保存文件信息typedef struct FileItem{int nItem; // 在列表框中的索引BOOL bDir; // 判断是否为文件夹CString strFileName; // 文件名}FILEITEM;主对话框类完成FTP的大部分功能其中:ID_control成员变量:CListCtrl m_ctrlRemoteFiles; // IDC_LIST_REMOTE 映射的列表型变量CListCtrl m_ctrlLocalFiles; // IDC_LIST_LOCAL 映射的列表型变量CString m_strPassword; // IDC_PASSWORD 映射的CString型变量CString m_strServer; // IDC_SERVER 映射的CString型变量CString m_strUserName; // IDC_USER 映射的CString型变量其他添加功能所需成员变量:CInternetSession* m_pInetSession; // 会话对象CFtpConnection* m_pFtpConnection; // 连接对象CFtpFileFind* m_pRemoteFinder; // 远程查找文件对象CFileFind m_LocalFinder; // 本地查找文件对象CString m_strLocalParentRoot; // 本地文件目录的上上一层目录CString m_strRemoteParentRoot; // 远程文件目录的上上一层目录CArray<FILEITEM,FILEITEM&>m_arrLocalFiles; // 保存本地文件信息CArray<FILEITEM,FILEITEM&>m_arrRemoteFiles; // 保存远程文件信息 成员函数:/* 初始化程序 */BOOL CMyFtpDlg::OnInitDialog()/* 给列表控件CListCtrl增加标题头 */void CMyFtpDlg::AddHeaders(CListCtrl* pLstCtrl)/* 给列表框增加一条记录 */void CMyFtpDlg::AddItem(CListCtrl* pLstCtrl,int nIndex,BOOL bDir,CString strText)/* 响应“download”按钮 */void CMyFtpDlg::OnDownload()/* 响应“Upload”按钮 */void CMyFtpDlg::OnUpload()/* 下载单个文件 */void CMyFtpDlg::DownFile(FILEITEM fileItem)/* 上传单个文件 */void CMyFtpDlg::UpFile(FILEITEM fileItem)/* 连接ftp服务器 */void CMyFtpDlg::OnConnect()/* 获得指定目录下的所有文件,并在列表框中显示 */void CMyFtpDlg::BrowseDir(CString strDir,CListCtrl* pLstCtrl,CFileFind* pFinder,CArray<FILEITEM,FILEITEM&>* pFilesArr)/* 本地文件目录中向上一层 */void CMyFtpDlg::OnLocalUp()/* 远程文件目录中向上一层 */void CMyFtpDlg::OnRemoteUp()主要函数1.在OnInitDialog()函数中进行对话框、列表的初始化,并且设定本地文件目录的默认路径为C盘为根目录。

FTP客户端和服务器源代码(C语言)实现

FTP客户端和服务器源代码(C语言)实现

课程设计:FTP的设计与实现/****************client.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 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 message BOOL bSendOnly = FALSE; // Send data only; don't 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] [-o]\n\n");printf(" -p:x Remote port to send to\n");printf(" -s:IP Server's IP address or hostname\n");printf(" -n:x Number of times to send message\n");printf(" -o Send messages only; don't receive\n");ExitProcess(1);}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 receive bSendOnly = 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// "c.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;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,"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){delfun(sClient,choice2);continue;}//elseputs("输入错误,请重新输入");fflush(stdin);fflush(stdin);printf("\n");printf("\n");}closesocket(sClient);WSACleanup();}int dirfun(SOCKET sClient){int ret;char *MSG="dir$";char szBuffer[80];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}//printf("Send %d bytes\n", ret);//printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示//ret = recv(sClient, szBuffer, 80, 0);//printf("%s",szBuffer);ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\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;}int getfun(SOCKET sClient,char filename[40]){int ret;FILE *fpre;char szBuffer[80];szMessage[0]='\0';strcat(szMessage, "get$");//strcat(szMessage, "\\");strcat(szMessage,filename);//printf("MSG[4]=%c\n",szMessage[4]);//szMessage[0]='g';szMessage[1]='e';szMessage[2]='t';////szMessage[4]='m';szMessage[5]='e';szMessage[6]='.';szMessage[7]='t';////szMessage[8]='x';szMessage[9]='t';szMessage[10]='\0';ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);ret = recv(sClient, szBuffer, 80, 0);/*if (ret == 0) // Graceful closebreak;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());break;}*/szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(strncmp( szBuffer,"125 Transfering...",strlen("125 Transfering...") )==0) {if( (fpre=fopen(filename,"w")) == NULL ){printf("open errer");return 1;printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\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("%s\n",szBuffer);fclose(fpre);}return 0;}int putfun(SOCKET sClient,char filename[40]){int ret;//int i;FILE *fpse;//char *filename;//char *MSG="get\0me.txt";char szBuffer[80],temp_buffer[80];//sprintf(szMessage, "get\0","te.txt\0");szMessage[0]='\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: %d\n", WSAGetLastError());return 1;}//printf("Send %d bytes\n", ret);//filename="me.txt";printf("filename=%s\n",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 completed... \r\n");ret = send(sClient, szBuffer, strlen(szBuffer), 0);fclose(fpse);return 0;}int pwdfun(SOCKET sClient){int ret;char *MSG="pwd$";char szBuffer[160];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 160, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';printf("%s\n",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[40]){int ret;szMessage[0]='\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: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);return 0;}int mdfun(SOCKET sClient,char pathname[20]){int ret;char szBuffer[160];//char *MSG="md$";szMessage[0]='\0';strcat(szMessage, "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: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\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 0;}int delfun(SOCKET sClient,char name[20]){int ret;char szBuffer[80];szMessage[0]='\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: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);while(!bSendOnly){ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';if(strncmp(szBuffer,"del ok",strlen("del ok"))==0){printf("del %s ok\n",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("?:显示你提供的命令");puts("quit :退出返回");return 0;}//int quit()/****************server.c****************/#include <stdio.h>#include <winsock.h>#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")WSADATA wsd;char sbuffer[80],rbuffer[80];//send and receive buffersint n,bytes;//countersSOCKET newsocket,ns_data;struct sockaddr_in remoteaddr; //remoteaddr_data;int port_connect=0;//port connect flagchar path[80]="";char order[100]="";//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);void HandleError(char *func);//server functions end//MAINint main(int argc, char *argv[]){struct sockaddr_in localaddr;//local address structureSOCKET s;//s_data;//welcome socket and welcome socket for data connection,and port connection for connect to clientint addr_inlen;//address lenght variableif (WSAStartup(MAKEWORD(2,2), &wsd) != 0){WSACleanup();printf("WSAStartup failed\n");}memset(&localaddr,0,sizeof(localaddr));//clear localaddrs = socket(PF_INET, SOCK_STREAM, 0);if (s <0){printf("socket failed\n");}localaddr.sin_family = AF_INET;if(argc == 2)localaddr.sin_port = htons((u_short)atoi(argv[1]));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 LOOPwhile (1){ // while loop 1//LISTENlisten(s,3);addr_inlen = sizeof(remoteaddr);//ACCEPT main connection (control connection)newsocket = accept(s,(struct sockaddr *)(&remoteaddr),&addr_inlen);if (newsocket == INVALID_SOCKET) break;printf("connected to %s at port %d \n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port));//Respond with welcome message, FTP client requires thosesprintf(sbuffer,"200 Welcome \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer,"530 Log in \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//INFINITE LOOPwhile (1) // while loop 2{n = 0;sy_error=1;while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[n], 1, 0);printf("rbuffer[%d]=%c\n",n,rbuffer[n]);if ((bytes < 0) || (bytes == 0))break;if (rbuffer[n] == '$'){rbuffer[n] = '\0';break;}if (rbuffer[n] != '\r')n++;} // end of while loop 3if ((bytes < 0) || (bytes == 0))break;printf("#The Server receives:# '%s' from client \n", rbuffer); //THE FTP COMMANDS 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,"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");sprintf(sbuffer, "221 Bye bye ... \r\n");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, strlen(sbuffer), 0);}} // end of while loop 2//CLOSE CONTROL SOCKETclosesocket(newsocket);printf("disconnected from %s at port %d, close control socket.\n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port));} // end of while loop 1//CLOSE WELCOME SOCKETclosesocket(s);printf("Welcome sockets close");return 0;}int sdirfun(SOCKET newsocket){char temp_buffer[80];printf("Equivalent to dir \n");order[0]='\0';strcat(order,"dir ");strcat(order,path);strcat(order," >tmp.txt");system(order);FILE *fin;fin=fopen("tmp.txt","r");sprintf(sbuffer, "125 Transfering... \r\n");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... \r\n");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... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sgetfun(SOCKET newsocket){printf("RETR mode.\r\n");int i=4,k=0;char filename[20],temp_buffer[80];// identify the filename from rbuffer after the word "RETR "while (1) // while loop 4{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of while loop 4order[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);char *p_filename=order;FILE *fp;if( (fp=fopen(p_filename,"r")) == NULL ){sprintf(sbuffer, "Sorry, cannot open %s. Please try again.\r\n",filename);bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);return 1;}else{printf("The file %s found,ready to transfer.\n",filename);sprintf(sbuffer, "125 Transfering... \r\n");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);}//end of whilefclose(fp);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);}sy_error=0;return 0;}int sputfun(SOCKET newsocket){printf("Equivalent to put. \n");int i=4,k=0;char filename[20];// identify the filename from rbuffer after the word "RETR "while (1){bytes = recv(newsocket, &rbuffer[i], 1, 0);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of whileorder[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);printf("filename=%s,",order);char *p_filename=order;FILE *fpse;if( (fpse=fopen(order,"w")) == NULL ){printf("open errer");return 1;}else{printf("The file %s found,ready to transfer.\n",filename);while(1){//读取流并显示int ret;ret = recv(newsocket, rbuffer, 80, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 0;}if(strncmp(rbuffer,"226 Transfer",strlen("226 Transfer"))==0){break;}fprintf(fpse,"%s",rbuffer);}printf("RBUFFER=%s",rbuffer);fclose(fpse);}sy_error=0;return 0;}int spwdfun(SOCKET newsocket){printf("Equivalent to pwd \n");//order[0]='\0';//strcat(order,"dir ");//strcat(order,path);//strcat(order,);system("cd >tmp.txt");FILE *fin;fin=fopen("tmp.txt","r+");sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);char temp_buffer[160];while (fgets(temp_buffer,80,fin)!=NULL){temp_buffer[strlen(temp_buffer)-1]='\0';printf("temp_buffer=%s",temp_buffer);///////////////////////////////目录判定if(path[0]!='\0')sprintf(sbuffer,"%s\\%s",temp_buffer,path);elsesprintf(sbuffer,"%s",temp_buffer);///////////////////////////////if (port_connect==0)//send(ns_data, sbuffer, strlen(sbuffer), 0);send(newsocket, sbuffer, strlen(sbuffer), 0);}fclose(fin);sprintf(sbuffer, "226 Transfer completed... \r\n");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... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int scdfun(SOCKET newsocket){int i=3,k=0;char name[20],name2[20];int j,count=0;//path overfollowint pathlen;printf("Equivalent to cd \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];name2[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';name2[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileif(path[0]!='\0')strcat(path,"\\");strcat(path,name);if(strncmp(name2,"..",2)==0){pathlen=strlen(path);for(j=pathlen-1;j>=0;j--){if(path[j]=='\\'){path[j]='\0';count++;}if(count==2){//path[j]='\0';break;}}printf("%d=\n",j);path[j+1]='\0';}printf("path=%s",path);sy_error=0;return 0;}int smdfun(SOCKET newsocket){char name[20];int i=3,k=0;printf("Equivalent to md \n");while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}}order[0]='\0';strcat(order,"md ");strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,name);system(order);//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){//closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sdelfun(SOCKET newsocket){int i=3,k=0;char name[20];printf("Equivalent to del \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileorder[0]='\0';strcat(order,"rd ");strcat(order,path);if(path[0]!='\0')strcat(path,"\\");strcat(order,name);system(order);sprintf(sbuffer,"del ok... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);if (bytes == SOCKET_ERROR){HandleError("recv()");sy_error=1;return 1;}sy_error=0;return 0;}void HandleError(char *func){char info[65]= {0};_snprintf(info, 64, "%s: %d\n", func, WSAGetLastError());printf(info);}。

基于WINSOCK的FTP客户端的实现

基于WINSOCK的FTP客户端的实现

基于Winsock的FTP客户端的实现目录一、课程设计基本要求 (2)课程设计目的 (2)课程设计任务 (2)课程设计要求 (2)二、程序简介 (2)开发环境 (2)程序界面 (3)三、原理概述 (4)FTP协议 (4)应用WinSock实现网络通信 (5)四、主要数据结构 (6)五、CFTPClient类 (8)控制连接的实现 (8)数据连接的实现 (11)六、体会 (13)一、课程设计基本要求●课程设计目的1 加深对TCP/IP协议的理解。

2 了解FTP协议的工作原理。

3 掌握用MFC编写FTP协议的实现程序。

●课程设计任务在Visual C++6.0的环境下实现FTP下载工具。

●课程设计要求1 了解FTP协议的工作原理。

(RFC765 , RFC2228, RFC2640, RFC2773)2 主要是基于TCP/IP的Winsock编程,用Visual C++6.0实现一个基于FTP协议的FTP下载工具(客户端)。

二、程序简介●开发环境操作系统:Microsoft Windows XP pro编译环境:Microsoft Visual C++ 6.0CPU:PM-1.7GHz内存:768MB硬盘:40MB分辨率:32bit 1024×768 程序界面三、原理概述FTP协议FTP是Internet上基于TCP/IP协议传输文件的应用层协议。

FTP规定了数据包的格式、数据包头部结构和命令结构等等。

FTP应用命令行方式传输文件。

FTP在RFC959中定义。

FTP应用TCP传输而不是UDP。

由FTP提供的文件传输是将一个完整的文件从一个系统复制到另一个系统中。

应用FTP首先需要登录FTP服务器,或者通过允许匿名FTP来使用FTP服务器。

FTP最早的设计是用于两台不同的主机即不同的操作系统下,不同的文件结构,不同的字符集。

FTP是建立两个TCP连接(见图) ,一个用于传输数据,另一个用于传输命令。

FTP客户端的设计与实现

FTP客户端的设计与实现

FTP客户端的设计与实现1. 简介FTP(File Transfer Protocol)是一种用于文件传输的标准协议。

FTP客户端是指使用FTP协议与FTP服务器进行通信并传输文件的程序。

在本文中,我们将探讨FTP客户端的设计与实现。

2. 设计2.1 功能需求FTP客户端的主要功能需求包括:1.连接到FTP服务器2.在FTP服务器和本地电脑之间传输文件3.列出FTP服务器上的文件和目录4.创建和删除FTP服务器上的目录5.重命名FTP服务器上的文件6.支持多种操作系统(如Windows、Linux等)2.2 架构设计FTP客户端采用MVC(Model-View-Controller)模式来设计,其中:•Model层:管理FTP客户端的业务与数据逻辑。

提供FTP相关的API,封装了FTP协议的底层实现。

•View层:处理和呈现用户界面。

•Controller层:处理用户请求,调用Model层实现相关业务逻辑。

2.3 技术选型FTP客户端的技术选型如下:•编程语言:Java•GUI框架:JavaFX•FTP库:Apache Commons Net•构建工具:Maven•版本控制:Git2.4 待解决问题FTP客户端在设计中会遇到以下问题:1.如何扩展支持更多的FTP协议?2.如何实现可靠的文件传输?3.如何提高用户界面的体验?3. 实现3.1 界面实现使用JavaFX框架实现FTP客户端的用户界面。

主要界面包括:•登录界面:输入FTP服务器地址、用户名和密码登录FTP服务器。

•主界面:显示FTP服务器上的文件和目录,并提供文件传输和操作的操作界面。

3.2 功能实现FTP客户端通过Apache Commons Net库实现FTP底层协议。

实现的功能包括:1.连接到FTP服务器FTPClient ftp = new FTPClient();ftp.connect(server, port);ftp.login(username, password);2.在FTP服务器和本地电脑之间传输文件ftp.retrieveFile(remoteFile, localFile);ftp.storeFile(remoteFile, localFile);3.列出FTP服务器上的文件和目录FTPFile[] files = ftp.listFiles(remoteDir);4.创建和删除FTP服务器上的目录ftp.mkd(remoteDir);ftp.rmd(remoteDir);5.重命名FTP服务器上的文件ftp.rename(from, to);4. 总结通过对FTP客户端的设计与实现,我们了解了FTP协议的底层实现和FTP客户端的主要功能。

最新电子信息科学与技术专业_毕业论文可选题目汇总5

最新电子信息科学与技术专业_毕业论文可选题目汇总5

m号指标;论文类说明创新点174光电传感器特性实验平台的研制光电传感器特性实验平台主要针对温州大学《感测技术》课程实验所设计的,其功能为:使用某种传感器与实验平台组成一个闭环系统,能够设定并控制转速大小,可以用来测试光电传感器的一些特性。

转速测量范围:0~2000转/分;频率测量范围:0~1MHz 较强的自学习能力,C,单片机知识,模拟电路知识设计175公交车语音报站器的设计应用于公交系统,提示乘客到站,极大方便了乘客。

主要利用存储语音资源和LED键盘显示模块完整地播放一条公交线路的站名,并且能够显示日期和时间,具有时间日期的设置功能。

①制作硬件电路并实现功能。

②通过按键选择到站语音提示,声音大小的调整,语音功率驱动电路。

③显示站台编号,设置和显示当前日期和时间。

显示时间,日期;声音调整;语言提示。

较强的自学习能力,C,单片机知识,模拟电路知识设计176 冲击大电流的产生与应用利用RLC振荡电路产生100-1000A,约50Hz大电流,利用单片机控制流程应用于校验断路器短路电流的瞬时特性.并与传统的方法进行比较.电流误差5%,总功率500W以内单片机,模电,电力电子设计177高功率因素电子镇流器的研发利用L6562有源功率因数修正芯片将220VAC变换成400VDC,再利用DC-AC变换制作40W高功率因素电子镇流器.学习不同场合电感的设计与制作功率因素0.95以上,效率85%以上模电,电力电子,磁性材料设计号指标;论文类说明创新点科研(《感测技术》课程教学改革的探索与实践)教师自拟(智能化仪器仪表)教师自拟教师自拟。

Windows server 2003搭建ftp服务器步骤

Windows server 2003搭建ftp服务器步骤

Windows server 2003搭建ftp服务器步骤参考,客户端使用主动模式(Windows server 2003 32/64位)在Windows下搭建ftp服务器可以使用系统自带的ftp服务。

以32 位的Windows server 2003为例,具体步骤如下:第一步:安装ftp服务a. 将i386文件拷贝到服务器上或插入Windows2003安装光盘b. 单击“开始-控制面板-添加或删除程序-添加/删除Windows组件”选项c. 在“组件”列表中,双击“应用程序服务器”选项,单击并选中“Internet 信息服务(IIS)”选项,然后单击“详细信息”按钮,打开“应用程序服务器子组件”窗口。

d. 选中“文件传输协议(FTP) 服务”这个选项,单击确定。

以上步骤如图1所示。

图1e. 单击“下一步”按钮。

出现提示时,如需要文件i386,则定位到刚才拷贝的i386文件,一直点下一步,最后点完成。

第二步:配置ftp站点a. 点击开始-管理工具-Internet 信息服务管理器,如图2所示。

图2b. 右键新建站点,点击下一步,填写FTP 站点描述,如图3。

图3c. 配置IP和端口,也可以选择默认的设置,点击下一步。

如图4。

图4d. 配置FTP用户隔离,选择隔离用户。

如图5。

图5e. 选择FTP的根目录,我在此C盘下新建了一个tmp目录,用它来做ftp的根目录。

设置好之后点击下一步,如图6。

图6f. 配置FTP站点的访问权限,点击下一步。

出现图7所示的界面。

出现这样的提示是因为我们的默认ftp站点是打开的,这个不用管它,点完成就可以了。

图7g. IIS 管理器的界面上,关掉FTP的默认站点,再在tmp站点上右键,点启动,就启动了新建的站点。

如图8。

图8f. 在tmp站点上右键,选择属性,可以配置tmp站点的属性.在这里可以设置ftp的站点目录以及站点目录的访问属性、是否允许匿名登录等属性。

如图9所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于Winsock的FTP客户端的实现目录一、课程设计基本要求 (2)课程设计目的 (2)课程设计任务 (2)课程设计要求 (2)二、程序简介 (2)开发环境 (2)程序界面 (3)三、原理概述 (4)FTP协议 (4)应用WinSock实现网络通信 (5)四、主要数据结构 (6)五、CFTPClient类 (8)控制连接的实现 (8)数据连接的实现 (11)六、体会 (13)一、课程设计基本要求●课程设计目的1 加深对TCP/IP协议的理解。

2 了解FTP协议的工作原理。

3 掌握用MFC编写FTP协议的实现程序。

●课程设计任务在Visual C++6.0的环境下实现FTP下载工具。

●课程设计要求1 了解FTP协议的工作原理。

(RFC765 , RFC2228, RFC2640, RFC2773)2 主要是基于TCP/IP的Winsock编程,用Visual C++6.0实现一个基于FTP协议的FTP下载工具(客户端)。

二、程序简介●开发环境操作系统:Microsoft Windows XP pro编译环境:Microsoft Visual C++ 6.0CPU:PM-1.7GHz内存:768MB硬盘:40MB分辨率:32bit 1024×768 程序界面三、原理概述FTP协议FTP是Internet上基于TCP/IP协议传输文件的应用层协议。

FTP规定了数据包的格式、数据包头部结构和命令结构等等。

FTP应用命令行方式传输文件。

FTP在RFC959中定义。

FTP应用TCP传输而不是UDP。

由FTP提供的文件传输是将一个完整的文件从一个系统复制到另一个系统中。

应用FTP首先需要登录FTP服务器,或者通过允许匿名FTP来使用FTP服务器。

FTP最早的设计是用于两台不同的主机即不同的操作系统下,不同的文件结构,不同的字符集。

FTP是建立两个TCP连接(见图) ,一个用于传输数据,另一个用于传输命令。

每个FTP主机都有一个“协议解析器”( Pr ot oco1 I nter p reter, PI )模块,负责解释并执行FTP命令和响应。

同时,每个FTP主机还有一个“FTP数据传送”( FTPData Transfer,D T)模块,负责处理数据。

FTP通过执行“Telnet”(虚拟终端)模块或通过完全重新实施Telnet 作为“协议解析器”。

FTP命令以纯文本形式发送,其响应同样也是纯文本形式,并在三位数字后跟某些文本。

这些数字可由软件用来确定下面要采取的步骤。

而文本则供用户阅读。

每一个命令都会产生一个或多个响应。

应用WinSock实现网络通信WinSock是Microsoft等公司联合开发的网络编程接口,其实是一种进程间相互通信的机制,并将这种进程间通信从单机环境扩展到网络环境,适合于开发主机/客户机通信程序。

网络通信包括两台主机或者两个进程通过网络传递数据,网络的每一端称为一个端点,而WinSock为网络端点的抽象表示。

当用其编程时,程序在网络对话的每端都需要一个Socket,两个Socket之间可以应用面向连接的或者是无连接的网络协议。

面向连接的协议通过互换确认信息在连接端口之间建立一条虚电路,它不必关心网络软件传送数据。

因而面向连接的客户程序不必指定本地协议端口,而只需为Socket提供远程主机信息;IP地址和协议端口,WinSock可自动保存本地IP地址和选择本地端口。

面向连接的WinSock客户机/服务器模型,服务器在没有请求到达时,它处于等待状态。

一旦请求到来,服务器立即产生一个子进程,然后回到等待状态,由子进程相应请求。

当下一个请求到达时,服务器再产生一个新进程。

其中,并发服务器成为主服务器,子进程称为从服务器。

这种主从服务器的方式巧妙地解决了并发请求问题。

四、主要数据结构CSFTPApp类CWinApp类的派生类,由编译器自动生成,该对象代表了应用进程的主线程。

CMainFrame类CFrameWnd类的派生类,由编译器自动生成,用于创建应用程序的主窗口,它能很好地支持系统菜单和控制条(工具条、状态条等)。

在编写文档/视图结构的应用程序时,它作为主窗口管理视图和文档对象。

CSFTPDoc类CDocument类的派生类,由编译器自动生成,它只是提供了一个框架,为文档对象与相关的其他对象(视图、应用程序对象及框架窗口等)进行交互提供了框架。

对CSFTPDoc 类的设计工作,基本上都是在这个已有框架的基础上,添加所需要的功能代码。

CDFTPView类CListView类的派生类,同样由编译器自动生成,在本程序中用于显示FTP服务器上的文件列表。

CAboutDlg类CDialog类的派生类,由编译器自动生成,用于显示帮助信息。

CMessageDlg类CDialog类的派生类,用于显示从FTP服务器发来的响应信息。

CListItem类用来解析FTP服务器发送过来的文件列表信息,将每个文件的类型、名称、大小、创建时间和访问权限分别提取出来。

CFTPClient类这是实现FTP协议的主要部分,也是本文档要着重解释的一个类。

五、CFTPClient类控制连接的实现FTP客户端与服务器端建立连接的流程为1.创建一个套接字,并且与服务器建立连接。

2.创建CArchive对象、CSocketFile对象和CSocket对象之间的关联。

3.用于控制的数据流连接已经建立,可以发送命令与接收响应。

4.依次发送USER和PASS命令成功登录服务器。

MFC中提供了一个网络编程模式,可以充分利用CSocket的特性。

该模式的基础是CSocketFile类。

使用方法如下:首先,构造一个CSocket对象;调用Create函数创建一个socket对象(SOCK_STREAM类型)。

接着,如果是客户程序,调用Connect连接到远地主机;如果是服务器程序,先调用Listen监听socket端口,收到连接请求后调用Accept接收请求。

然后,创建一个和CSocket对象关联的CSocketFile对象,创建一个和CSocketFile 对象关联的CArchive对象,指定CArchive对象是用于读或者写。

如果既要读又要写,则创建两个CArchive对象。

创建工作完成之后,使用CArchive对象在客户和服务器之间传送数据。

使用完毕,销毁CArchive对象、CSocketFile对象、CSocket对象。

BOOL ConnectServer(CString serverhost,int serverport);首先创建一个套接字与服务器建立连接。

(代码如下图)然后建立CArchive对象(m_pCtrlOutarch和m_pCtrlInarch)、CSocketFile对象(m_pCtrlsokfile)和CSocket对象(m_Ctrlsok)之间的关联,用于发送和接收数据。

(代码如下图)BOOL FTPcommand(CString command);BOOL WriteStr(CString outputstring);int ReadStr();后两个方法WriteStr和ReadStr利用已经在ConnectServer()中初始化的两个CArchive对象提供的方法向服务器发送和接受数据,而FTPcommand(CString command)则是调用这两个函数实现发送命令和接收响应的功能。

(代码如下图)值得一提的是m_fc表示响应代码的第一位。

在FTP协议中,对响应代码有着详细的规定,1yz表示预备状态,2yz表示完成状态,3yz表示中间状态,4yz表示暂时拒绝状态,5yz表示永久拒绝状态。

例如:150 File status okay; about to open data connection. (文件状态OK,将打开数据连接)200 Command okay. (命令OK)331 User name okay, need password. (用户名OK,需要密码)425 Can't open data connection. (不能打开数据连接)501 Syntax error in parameters or arguments. (参数语法错误)故m_fc可用于判断操作是否成功。

BOOL Logon(CString hostname,int hostport,CString username, CString password);登录FTP服务器的函数,(主要代码如下)。

数据连接的实现BOOL DownloadFile(CString remotefile, CString localfile,BOOL get);数据传输由本函数实现流程图如下:BOOL List();本函数用于接收由数据通道发来的文件列表信息,基本流程与DownloadFile函数相同,唯一的区别是DownloadFile把数据写入文件,而List()接收数据后进行解析并显示出来。

六、体会通过本工程的实践,不论是FTP原理和算法,还是编程能力上都有很大提高。

一方面,实践了许多计算机网络介绍的算法,使得学习印象很深,收获很大,另一方面,熟悉了VC++和MFC环境编程,使自己在能力上有很大的提高。

项目完成过程中得到了助教和同学的悉心帮助,在此表示感谢。

相关文档
最新文档