




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、(1)头文件:FTPClient.h#include<conio.h>#define MAX_SIZE 4096#include<iostream>#include<winsock2.h>#include<string>#include<fstream>#pragma comment(lib,"ws2_32.lib")using namespace std;class FTPClientpublic:bool RecvReply(); /控制连接接收bool SendCommand(); /向FTP服务器发送命令b
2、ool DataConnect(char* ServerAddr); /向FTP服务器发送命令bool mkdirectory(); /FTP服务器发送MKD命令bool changedir(); /FTP服务器发送CWD命令bool FTPConnection(char* FTPIP,int port); /建立与Socket库绑定bool useuser(); /向FTP服务器发送USER命令bool usepass(); /向FTP服务器发送PASS命令void subcommend(string& filepath,string& filename); /输入和转换IP
3、地址void storfile(char* FTPIP); /上传文件void retrfile(char* FTPIP); /下载文件void listftp(char* FTPIP); /列出FTP服务器目录void deletefile(); /删除文件void quitftp(); /退出客户端void help(); /帮助void about(); /aboutbool ishavedetail;char CmdBufMAX_SIZE;char CommandMAX_SIZE;char ReplyMsgMAX_SIZE;private:int nReplycode;bool bCo
4、nnected;bool buser;SOCKET SocketControl;SOCKET SocketData;(2)源文件:FTPClient.cpp#include<conio.h>#define MAX_SIZE 4096#include<iostream>#include<winsock2.h>#include<string>#include<fstream>#include"FTPClient.h"using namespace std;#pragma comment(lib,"ws2_32
5、.lib")bool FTPClient:RecvReply() /控制连接接收int nRecv;memset(ReplyMsg, 0, MAX_SIZE);nRecv = recv(SocketControl, ReplyMsg, MAX_SIZE, 0);if (nRecv = SOCKET_ERROR)cout << "Socket receive error!" << endl;closesocket(SocketControl);return false;/获取相应信息与响应码if (nRecv > 4)char *Rep
6、lyCodes = new char3;memset(ReplyCodes, 0, 3);memcpy(ReplyCodes, ReplyMsg, 3);nReplycode = atoi(ReplyCodes);return true;bool FTPClient:SendCommand() /向FTP服务器发送命令/控制连接发送数据int nSend;nSend = send(SocketControl, Command, strlen(Command), 0);if (nSend = SOCKET_ERROR)cout << "Socket send error!&
7、quot; << endl;return false;return true;bool FTPClient:DataConnect(char* ServerAddr)/向FTP服务器发送PASV命令memset(Command, 0, MAX_SIZE);memcpy(Command, "PASV", strlen("PASV");memcpy(Command + strlen("PASV"), "rn", 2);if (!SendCommand()return false;/获取PASV命令的应答信息
8、if (RecvReply()if (nReplycode != 227)cout << "PASV response error!" << endl;closesocket(SocketControl);return false;/分离PASV命令应答信息char* part6;if (strtok(ReplyMsg, "(")for (int i = 0; i < 5; i+)parti = strtok(NULL, ",");if (!parti)return false;part5 = strto
9、k(NULL, ")");if (!part5)return false;elsereturn false;/获取FTP服务器数据端口、unsigned short ServerPort;ServerPort = unsigned short(atoi(part4) << 8) + atoi(part5);/创建数据连接SocketSocketData = socket(AF_INET, SOCK_STREAM, 0);if (SocketData = INVALID_SOCKET)cout << "Create socket error!
10、" << endl;return false;/定义Socket地址和端口sockaddr_in serveraddr2;memset(&serveraddr2, 0, sizeof(serveraddr2);serveraddr2.sin_family = AF_INET;serveraddr2.sin_port = htons(ServerPort);serveraddr2.sin_addr.S_un.S_addr = inet_addr(ServerAddr);/向FTP服务器发送Connect请求int nConnect;nConnect = connec
11、t(SocketData, (sockaddr*)&serveraddr2, sizeof(serveraddr2);if (nConnect = SOCKET_ERROR)cout << endl << "Server connect error!" << endl;return false;return true;bool FTPClient:mkdirectory() /FTP服务器发送MKD命令if (!ishavedetail)cout << "请输入你要创建的文件夹名:"memset(C
12、mdBuf, 0, MAX_SIZE);cin.getline(CmdBuf, MAX_SIZE, 'n');memset(Command, 0, MAX_SIZE);memcpy(Command, "MKD ", strlen("MKD ");memcpy(Command + strlen("MKD "), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("MKD ") + strlen(CmdBuf), "rn", 2);/cou
13、t<<"Command:"<<Command<<endl;if (!SendCommand()return false;/-获得MKD命令的应答信息-if (RecvReply()if (nReplycode = 257)/257:cout << ReplyMsg << endl;elsecout << "MKD response error!" << endl;closesocket(SocketControl);return false;return true;boo
14、l FTPClient:changedir() /FTP服务器发送CWD命令if (!ishavedetail)cout << "请输入你要进入的文件夹路径:"memset(CmdBuf, 0, MAX_SIZE);cin.getline(CmdBuf, MAX_SIZE, 'n');memset(Command, 0, MAX_SIZE);memcpy(Command, "CWD ", strlen("CWD ");memcpy(Command + strlen("CWD "), Cm
15、dBuf, strlen(CmdBuf);memcpy(Command + strlen("CWD ") + strlen(CmdBuf), "rn", 2);if (!SendCommand()return false;/-获得CWD命令的应答信息-if (RecvReply()cout << "nReplyCode:" << nReplycode << endl;if (nReplycode = 250)/257:cout << ReplyMsg << endl;else
16、cout << "CWD response error!" << endl;closesocket(SocketControl);return false;return true;bool FTPClient:FTPConnection(char* FTPIP, int port) /建立与Socket库绑定WSADATA WSAData; /WSADAT:WSADATA结构被用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息if (WSAStartup(MAKEWORD(2, 2), &WSADat
17、a) != 0) /WSAStartup:初始化当前线程通信环境 MAKEWORD:合并短整数cout << "WSAStartup error!" << endl;return false;/创建控制连接SocketSocketControl = socket(AF_INET, SOCK_STREAM, 0);if (SocketControl = INVALID_SOCKET)cout << "Creat socket error!" << endl;return false;/定义Socket地址和端
18、口sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr);serveraddr.sin_family = AF_INET;/serveraddr.sin_port = htons(port);/端口serveraddr.sin_addr.S_un.S_addr = inet_addr(FTPIP);/地址/向FTP服务器发送Connect请求cout << "FTP>Control connect." << endl;int nConnect = connect(
19、SocketControl, (sockaddr*)&serveraddr, sizeof(serveraddr);if (nConnect = SOCKET_ERROR)cout << "Server connect error!" << endl;return false;/获得Connect应答信息if (RecvReply()if (nReplycode = 220)cout << ReplyMsg << endl;elsecout << "Connet response error!&q
20、uot; << endl;closesocket(SocketControl);return false;bConnected = true;return true;bool FTPClient:useuser() /向FTP服务器发送USER命令cout << "FTP>用户名:"memset(CmdBuf, 0, MAX_SIZE);cin.getline(CmdBuf, MAX_SIZE, 'n');memset(Command, 0, MAX_SIZE);memcpy(Command, "USER "
21、, strlen("USER ");memcpy(Command + strlen("USER "), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("USER ") + strlen(CmdBuf), "rn", 2);cout << "Command:" << Command << endl;if (!SendCommand()return false;/获得USER命令的应答信息if (RecvReply(
22、)if (nReplycode = 331)/230:User logged in,proceed;/331:User Name okay,need password;cout << ReplyMsg << endl;elsecout << "USER response error!" << endl;closesocket(SocketControl);return false;buser = true;return true;bool FTPClient:usepass() /向FTP服务器发送PASS命令if (buse
23、r)buser = false;cout << "FTP>密 码:"memset(CmdBuf, 0, MAX_SIZE);cout.flush();for (int i = 0; i < MAX_SIZE; i+)CmdBufi = getch();if (CmdBufi = 'r')CmdBufi = '0'break;elsecout << '*'cout << endl;memset(Command, 0, MAX_SIZE);memcpy(Command, "
24、PASS ", strlen("PASS ");memcpy(Command + strlen("PASS "), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("PASS ") + strlen(CmdBuf), "rn", 2);if (!SendCommand()return false;/获得PASS命令的应答信息if (RecvReply()if (nReplycode = 230)/230:User logged in,proceed;cout
25、<< ReplyMsg << endl;elsecout << "PASS respanse error!" << endl;return false;return true;void FTPClient:storfile(char* FTPIP)if (!ishavedetail)cout << "请输入上传文件名:"memset(CmdBuf, 0, MAX_SIZE);cin.getline(CmdBuf, MAX_SIZE, 'n');ifstream f2;f2.ope
26、n(CmdBuf, ios:in);if (!f2)cout << "Cannot open file!" << endl;return;string strPath(CmdBuf);string filepath, filename;int nPos = strPath.rfind('');if (-1 != nPos)filename = strPath.substr(nPos + 1, strPath.length() - nPos - 1);filepath = strPath.substr(0, nPos);cout <
27、;< "filename:" << filename << endl;cout << "filepath:" << filepath << endl;memset(CmdBuf, 0, MAX_SIZE);memcpy(CmdBuf, filename.data(), strlen(filename.data();char FtpStorMAX_SIZE;memset(FtpStor, 0, MAX_SIZE);memcpy(FtpStor, FTPIP, strlen(FTPIP);if
28、 (!DataConnect(FtpStor)return;memset(Command, 0, MAX_SIZE);memcpy(Command, "STOR ", strlen("STOR ");memcpy(Command + strlen("STOR "), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("STOR ") + strlen(CmdBuf), "rn", 2);if (!SendCommand()return;if (Recv
29、Reply()if (nReplycode = 125 | nReplycode = 150 | nReplycode = 226)cout << ReplyMsg;else cout << "STOR respanse error!" << endl;closesocket(SocketControl);return;char ListBuf2MAX_SIZE;while (true)memset(ListBuf2, 0, MAX_SIZE);f2.read(ListBuf2, MAX_SIZE);int nStor = send(So
30、cketData, ListBuf2, MAX_SIZE, 0);if (nStor = SOCKET_ERROR)cout << endl << "Socket send error!" << endl;closesocket(SocketData);return;break;f2.close();closesocket(SocketData);if (RecvReply()if (nReplycode = 226)cout << ReplyMsg;elsecout << "STOR response
31、error!" << endl;closesocket(SocketControl);return;void FTPClient:retrfile(char* FTPIP)if (!ishavedetail)cout << "请输入下载文件名:" << endl;memset(CmdBuf, 0, MAX_SIZE);cin.getline(CmdBuf, MAX_SIZE, 'n');char FtpRetrMAX_SIZE;memset(FtpRetr, 0, MAX_SIZE);memcpy(FtpRetr
32、, FTPIP, strlen(FTPIP);if (!DataConnect(FtpRetr)return;memset(Command, 0, MAX_SIZE);memcpy(Command, "RETR ", strlen("RETR ");memcpy(Command + strlen("RETR "), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("RETR ") + strlen(CmdBuf), "rn", 2);cout <
33、;< "请输入保存的文件名:"memset(CmdBuf, 0, MAX_SIZE);cin.getline(CmdBuf, MAX_SIZE, 'n');if (!SendCommand()return;if (RecvReply()cout << "nReplyCode:" << nReplycode;if (nReplycode = 125 | nReplycode = 150 | nReplycode = 226)cout << ReplyMsg;else cout << &q
34、uot;RETR respanse error!" << endl;closesocket(SocketControl);return;ofstream f1(CmdBuf);if (!f1)cout << "file can not open" << endl;return;int nRetr;char ListBuf1MAX_SIZE;while (true)memset(ListBuf1, 0, MAX_SIZE);nRetr = recv(SocketData, ListBuf1, MAX_SIZE, 0);f1.wri
35、te(ListBuf1, MAX_SIZE);if (nRetr = SOCKET_ERROR)cout << endl << "Socket receive error!" << endl;closesocket(SocketData);return;if (nRetr <= 0)break;f1.close();closesocket(SocketData);if (RecvReply()if (nReplycode = 226)cout << ReplyMsg;elsecout << "RET
36、R response error!" << endl;closesocket(SocketControl);return;void FTPClient:listftp(char* FTPIP) /列出FTP服务器目录/FTP服务器发送LIST命令char FtpServerMAX_SIZE;memset(FtpServer, 0, MAX_SIZE);memcpy(FtpServer, FTPIP, strlen(FTPIP);if (!DataConnect(FtpServer)/数据连接return;memset(Command, 0, MAX_SIZE);memcp
37、y(Command, "LIST", strlen("LIST");memcpy(Command + strlen("LIST"), "rn", 2);if (!SendCommand()return;/-获得LIST命令的应答信息-if (RecvReply()/125:Data connection alreadly open;transfer staring./150:File status okay, about to data connection;/226: closing data connectio
38、n;/150:Opening ASCII mode data connection for /bin/ls;if (nReplycode = 125 | nReplycode = 150 | nReplycode = 226)cout << ReplyMsg;else cout << "LIST respanse error!" << endl;closesocket(SocketControl);return;/获得LIST命令的目录信息int nRecv;char ListBufMAX_SIZE;while (true)memset(
39、ListBuf, 0, MAX_SIZE);nRecv = recv(SocketData, ListBuf, MAX_SIZE, 0);if (nRecv = SOCKET_ERROR)cout << endl << "Socket receive error!" << endl;closesocket(SocketData);return;if (nRecv <= 0)break;cout << ListBuf;closesocket(SocketData);/-获得LIST命令的应答信息-if (RecvReply
40、()if (nReplycode = 226)/226: closing data connection;transfer complete;cout << ReplyMsg;elsecout << "LIST response error!" << endl;closesocket(SocketControl);return;void FTPClient:deletefile() /if (!ishavedetail)cout << "请输入你要删除的文件名:"memset(CmdBuf, 0, MAX_
41、SIZE);cin.getline(CmdBuf, MAX_SIZE, 'n');memset(Command, 0, MAX_SIZE);memcpy(Command, "DELE ", strlen("DELE ");memcpy(Command + strlen("DELE "), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("DELE ") + strlen(CmdBuf), "rn", 2);if (!SendComma
42、nd()return;/-获得DELE命令的应答信息-if (RecvReply()if (nReplycode = 250)/230:User logged in,proceed;/331:User Name okay,need password;cout << ReplyMsg << endl;elsecout << "DELE response error!" << endl;closesocket(SocketControl);return;void FTPClient:quitftp()/-向FTP服务器发送QUIT
43、命令-memset(Command, 0, MAX_SIZE);memcpy(Command, "QUIT", strlen("QUIT");memcpy(Command + strlen("QUIT"), "rn", 2);if (!SendCommand()return;/-获得QUIT命令的应答信息-if (RecvReply()if (nReplycode = 221)/221:goodbay,closing session;cout << ReplyMsg;bConnected = false
44、;/buser=false;closesocket(SocketControl);return;elsecout << endl << "QUIT response error!" << endl;closesocket(SocketControl);return;WSACleanup();void FTPClient:subcommend(string& filepath, string& filename) /输入和转换IP地址memset(CmdBuf, 0, MAX_SIZE);cin.getline(CmdBuf
45、, MAX_SIZE, 'n');string strPath(CmdBuf);int nPos = strPath.rfind(' ');if (-1 != nPos)filename = strPath.substr(nPos + 1, strPath.length() - nPos - 1);filepath = strPath.substr(0, nPos);elsefilepath = CmdBuf;void FTPClient:about()cout << "-关于FTP客户端控制台版-" << endl;
46、cout << endl;cout << "程序名称:FTP客户端控制台版" << endl;cout << "程序语言:C+" << endl;cout << "小组成员:刘锐翊 杨润 牟林 李良俊 陈秋燕 毛虹" << endl;cout << "编译日期:2015年12月30日" << endl;cout << endl;cout << "-" <<
47、; endl;cout << endl;void FTPClient:help()cout << "-FTP客户端控制台版帮助-" << endl;cout << endl;cout << "ls 列出所有目录与文件" << endl;cout << "stor 上传文件" << endl;cout << "retr 下载文件" << endl;cout << "dele 删除文件" << endl;cout << "mkd 创建文件" << endl;cout << "cwd 进入指定目录" << endl;cout << "help 帮助" << endl;cout << "about
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 岩土基础课课件
- 小龙虾水彩课件
- 输液泵应急预案脚本课件
- 小鸭子学游泳课件
- 商铺租赁合同终止及租赁物使用消防安全协议书范本
- 水稻-养殖一体化土地承包种植合同
- 小鸡家着火了课件
- 小食品调味培训课件模板
- 设备制造行业细分领域高端装备制造业发展策略分析报告
- 贪吃的变色龙课件
- T/CCOA 52-2023富硒小麦粉
- 2025年护士执业资格考试题库(社区护理学专项)护理法律法规知识试题卷
- 老人就餐免责协议书
- 应聘家教兼职简历
- 慢阻肺的健康教育讲座
- 光伏电站安全风险辨识及风险库管理制度
- 铁路机车防火安全教育
- 企业内训师培养与培训课程设计
- 网架防腐刷漆施工方案
- 《采矿方法的选择案例综述》1700字
- 新冀教版二年级数学上册教学计划与课程标准对接
评论
0/150
提交评论