命令字符串缓冲 ftpClient::ipAddress ip地址缓冲
ftpClient::listBuffer 列表信息缓冲 ftpClient::port 控制端口信息
ftpClient::portForData 数据端口信息
ftpClient::serveraddr
用于建立控制套接字参数,系统库参数 ftpClient::serveraddrData
用于建立数据套接字参数,系统库参数 ftpClient::socketControl 控制连接套接字 ftpClient::socketData 数据连接套接字 ftpClient::wsd
系统库参数,代表WSAData。
21 / 37
程序框图
START 输入服务器IP,PORT 连接服务器 输入用户名密码 身份验证 输入命令 判断命令 执行对应模块 LIST CWD DELE QUIT 完成命令 STOR MKD RMD RETR END
注:有少数功能学校服务器不支持。
22 / 37
实验结果
23 / 37
源代码
ftpClient.h
#include
#include
#pragma comment(lib,\#pragma comment(lib,%using namespace std; /*
封装ftpClient类 **/
class ftpClient {
private: WSAData wsd;//系统库参数 string ipAddress;//ip地址缓存 int port;//控制端口信息 char *buffer;//数据缓冲 char *cmdBuffer;//应答信息缓冲 char *listBuffer;//列表信息缓冲
24 / 37
char *command;//命令字符串缓冲 int portForData;//数据端口信息 SOCKET socketData;//数据连接套接字 SOCKET socketControl;//控制连接套接字 sockaddr_in serveraddrData;//用于建立数据套接字参数,系统库参数 sockaddr_in serveraddr;//用于建立控制套接字参数,系统库参数 /******************************************* 返回cmdBuffer中有的应答码 cmdBuffer必须有返回信息
前提条件:cmdbuffer中尚存PASV命令的应答信息 用来获取cmdBuffer中的端口信息并进行转换 *******************************************/ int getCode() { int code = 100*(cmdBuffer[0]-'0')+10*(cmdBuffer[1]-'0')+(cmdBuffer[2]-'0'); return code; }
/******************************************* 初始化控制连接
初始化客户端,连接服务器,成功返回1
失败返回0,打印欢迎信息,server返回信息,IP *******************************************/ int interlizeSocket() { //建立与Socket库绑定 WSAStartup(MAKEWORD(2,2),&wsd); //创建流式Socket socketControl = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //填充本地Socket地址 serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(port); serveraddr.sin_addr.s_addr=inet_addr(ipAddress.c_str()); //向FTP服务器发送Connect请求 connect (socketControl, (sockaddr*)&serveraddr, sizeof(serveraddr)); //从FTP服务器获得Connect应答 if (recv(socketControl,cmdBuffer,512,0)) { cout<<\ //判断Connect请求的应答码 if(getCode() == 220) { memset (cmdBuffer,NULL,512); return 1; }
25 / 37