您好,欢迎访问三七文档
武汉轻工大学数学与计算机学院《TCP/IPSocket编程》FTP客户机2016年5月26日学号:姓名:指导老师:班级:网工1301Ftp客户端程序设计第1页共10页课设要求:编写一个FTP客户机程序,具体要求如下:要求实现的程序为图形化界面,可以输入FTP服务的相关信息(包括IP地址、用户名与密码),输出交互过程中的FTP命令与响应信息,以及从FTP服务器获得的文件(或目录)列表要求实现USER、PASS、PASV、LIST与QUIT命令。点击“Connect”按钮,实现USER与PASS命令;点击“List”按钮,实现PASV与LIST命令;点击“Quit”按钮,实现QUIT命令。图形界面为:Ftp客户端程序设计第2页共10页知识点FTP服务,它使用文件传输协议(FTP,FileTransferProtocol)每个FTP服务器有自己的FTP服务器名,例如ftp.pku.edu.cn很多FTP服务器提供匿名FTP服务,它有一个公开的账号(通常为anonymous)FTP客户机主要有3种:FTP命令行程序、服务是一种有连接的服务,采用的传输层协议是TCP协议计算机网络客户进程FTP客户机服务进程FTP服务器数据连接临时端口控制连接熟知端口2120FTP客户机与服务器之间传输控制信息,用于完成某个FTP操作FTP命令:FTP客户机向服务器发送的操作请求FTP响应:FTP服务器根据操作情况向客户机返回的信息1.建立控制连接FTP客户机调用socket()函数建立套接字FTP客户机填充服务器的套接字地址Ftp客户端程序设计第3页共10页FTP客户机调用connect()函数请求与服务器建立连接FTP客户机接收与分析服务器返回的响应信息主要代码:voidCFtpClientDlg::OnConnect(){GetDlgItemText(IDC_EDIT3,m_Address);GetDlgItemText(IDC_EDIT4,m_Account);GetDlgItemText(IDC_EDIT5,m_Password);WSADATAWSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//建立套接字绑定{MessageBox(初始化Winsock失败!);return;}SocketControl=socket(AF_INET,SOCK_STREAM,0);//创建连接套接字if(SocketControl==INVALID_SOCKET){MessageBox(创建控制Socket失败!);WSACleanup();return;}intIpAddress;//判断域名或IP地址IpAddress=inet_addr(m_Address);if(IpAddress==INADDR_NONE){hostent*pHostent=gethostbyname(m_Address);if(pHostent)IpAddress=(*(in_addr*)pHostent-h_addr).s_addr;}sockaddr_inserveraddr;//定义套接字地址memset(&serveraddr,0,sizeof(serveraddr));serveraddr.sin_family=AF_INET;serveraddr.sin_port=htons(21);serveraddr.sin_addr.s_addr=IpAddress;m_Login+=Client:Connectto;m_Login+=m_Address;m_Login+=...\r\n;intnConnect;nConnect=connect(SocketControl,(sockaddr*)&serveraddr,sizeof(serveraddr));if(nConnect==SOCKET_ERROR)//建立FTP控制连接{Ftp客户端程序设计第4页共10页MessageBox(控制连接建立失败!);closesocket(SocketControl);WSACleanup();return;}if(!RecvRespond())return;else{if(RespondCode==220)//判断连接应答码{m_Login+=Server:;m_Login+=Respond;}else{MessageBox(控制连接响应错误!);closesocket(SocketControl);WSACleanup();return;}}memset(Command,0,MAX_SIZE);memcpy(Command,USER,strlen(USER));//合成USER命令memcpy(Command+strlen(USER),m_Account,strlen(m_Account));memcpy(Command+strlen(USER)+strlen(m_Account),\r\n,2);if(!SendCommand())//发送USER命令return;m_Login+=Client:;m_Login+=Command;if(!RecvRespond())return;else{if(RespondCode==220||RespondCode==331)//判断USER应答码{m_Login+=Server:;m_Login+=Respond;}else{MessageBox(USER响应错误!);closesocket(SocketControl);WSACleanup();Ftp客户端程序设计第5页共10页return;}}if(RespondCode==331){memset(Command,0,MAX_SIZE);//合成PASS命令memcpy(Command,PASS,strlen(PASS));memcpy(Command+strlen(PASS),m_Password,strlen(m_Password));memcpy(Command+strlen(PASS)+strlen(m_Password),\r\n,2);if(!SendCommand())//发送PASS命令return;m_Login+=Client:PASS******\r\n;if(!RecvRespond())return;else{if(RespondCode==230||RespondCode==226){m_Login+=Server:;m_Login+=Respond;}else{MessageBox(PASS响应错误!);closesocket(SocketControl);WSACleanup();return;}}}UpdateData(false);}2.登录FTP服务器登录FTP服务器使用USER与PASS命令,分别用来输入用户名与密码USER与PASS命令按规定顺序出现FTP客户机向服务器发送USER命令FTP客户机向服务器发送PASS命令Ftp客户端程序设计第6页共10页3.列出FTP目录LIST命令用来返回当前目录中的信息,需要使用数据连接传输目录信息建立数据连接有2种方法:PORT或PASV命令PORT方式称为主动模式,FTP客户机指定用于数据连接的端口PASV方式称为被动模式,FTP服务器在响应信息中指出用于数据连接的端口主要代码:voidCFtpClientDlg::OnList(){if(!DataConnect())//建立数据连接return;memset(Command,0,MAX_SIZE);//合成LIST命令memcpy(Command,LIST,strlen(LIST));memcpy(Command+strlen(LIST),\r\n,2);if(!SendCommand())//发送LIST命令return;m_Login+=Client:;m_Login+=Command;if(!RecvRespond())return;else{if(RespondCode==125||RespondCode==150||RespondCode==226){m_Login+=Server:;m_Login+=Respond;}else{MessageBox(LIST响应错误!);closesocket(SocketControl);WSACleanup();return;}}Ftp客户端程序设计第7页共10页m_Login+=Client:......\r\n;while(true){charListBuf[MAX_SIZE];memset(ListBuf,0,MAX_SIZE);nRecv=recv(SocketData,ListBuf,MAX_SIZE,0);intnRecv;if(nRecv==SOCKET_ERROR)//读取目录信息{MessageBox(LIST接收错误!);closesocket(SocketData);WSACleanup();return;}if(nRecv=0)break;m_Directory=ListBuf;//显示目录信息}closesocket(SocketData);//关闭数据连接if(!RecvRespond())return;else{if(RespondCode==226)//判断LIST应答码{m_Login+=Server:;m_Login+=Respond;}else{MessageBox(LIST响应错误!);closesocket(SocketControl);WSACleanup();return;}}UpdateData(false);}4.退出FTP服务器FTP客户机向服务器发送QUIT命令Ftp客户端程序设计第8页共10页断开FTP客户机与服务器之间的控制连接释放控制连接使用的套接字主要代码:voidCFtpClientDlg::OnQuit(){memset(Command,0,MAX_SIZE);//合成QUIT命令memcpy(Command,QUIT,strlen(QUIT));memcpy(Command+strlen(QUIT),\r\n,2);if(!SendCommand())//发送QUIT命令return;else{if(RespondCode==221)//判断QUIT应答码{m_Login+=Server:;m_Login+=Respond;m_Directory=;}else{MessageBox(QUIT响应错误!);closesocket(SocketControl);WSACleanup();return;}}UpdateData(false);closesocket(SocketControl);WSACleanup();//释放套接字绑定}5.使用VisualC++6.0编译程序设计MFC图形界面为:Ftp客户端程序设计第9页共10页Ftp客户端程序设计第10页共10页6.实验总结理解FTP工作原理,就会对实验的过程和运行更加清晰。在本次实验中我们是在郑凯同学的一步一示范中去完成每一步的实验的,虽然最终顺利完成了实验,但是对于具体代码段的分析并不是很了解只是清楚每一步骤如何去实验然后最终完整ftp客户端。
本文标题:FTP客户机
链接地址:https://www.777doc.com/doc-5841840 .html