收藏 分销(赏)

linux FTP 客户端.docx

上传人:pc****0 文档编号:8901650 上传时间:2025-03-07 格式:DOCX 页数:24 大小:17.84KB 下载积分:10 金币
下载 相关 举报
linux FTP 客户端.docx_第1页
第1页 / 共24页
linux FTP 客户端.docx_第2页
第2页 / 共24页


点击查看更多>>
资源描述
#ifndef CLIENT_H_ #define CLIENT_H_ #include <sys/socket.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <sys/stat.h> #include <netdb.h> #include <errno.h> #include <arpa/inet.h> #include <sys/stat.h> #include <string> #include <list> #define INVALID_SOCKET -1 #define FTP_API int #define MAX_PATH 260 #define trace printf #define FTP_PARAM_BASE #define FTP_DEFAULT_PORT "21" //FTP默认端口号 #define FTP_DEFAULT_BUFFER 1024*4 //FTP下载缓冲默认大小 #define FTP_DEFAULT_PATH "/mnt/dvs/" //FTP默认保存路径 #define FTP_COMMAND_BASE 1000 #define FTP_COMMAND_END FTP_COMMAND_BASE + 30 #define FTP_COMMAND_USERNAME FTP_COMMAND_BASE + 1 //用户名 #define FTP_COMMAND_PASSWORD FTP_COMMAND_BASE + 2 //密码 #define FTP_COMMAND_QUIT FTP_COMMAND_BASE + 3 //退出 #define FTP_COMMAND_CURRENT_PATH FTP_COMMAND_BASE + 4 // 获取文件路径 #define FTP_COMMAND_TYPE_MODE FTP_COMMAND_BASE + 5 // 改变传输模式 #define FTP_COMMAND_PSAV_MODE FTP_COMMAND_BASE + 6 // 被动端口模式 #define FTP_COMMAND_DIR FTP_COMMAND_BASE + 7 // 获取文件列表 #define FTP_COMMAND_CHANGE_DIRECTORY FTP_COMMAND_BASE + 8 // 改变路径 #define FTP_COMMAND_DELETE_FILE FTP_COMMAND_BASE + 9 // 删除文件 #define FTP_COMMAND_DELETE_DIRECTORY FTP_COMMAND_BASE + 10 // 删除目录/文件夹 #define FTP_COMMAND_CREATE_DIRECTORY FTP_COMMAND_BASE + 11 // 创建目录/文件夹 #define FTP_COMMAND_RENAME_BEGIN FTP_COMMAND_BASE +12 // 开始重命名 #define FTP_COMMAND_RENAME_END FTP_COMMAND_BASE + 13 // 重命名结束 #define FTP_COMMAND_FILE_SIZE FTP_COMMAND_BASE + 14 // 获取文件大小 #define FTP_COMMAND_DOWNLOAD_POS FTP_COMMAND_BASE + 15 // 下载文件从指定位置开始 #define FTP_COMMAND_DOWNLOAD_FILE FTP_COMMAND_BASE + 16 // 下载文件 #define FTP_COMMAND_UPLOAD_FILE FTP_COMMAND_BASE + 17 // 上传文件 #define FTP_COMMAND_APPEND_FILE FTP_COMMAND_BASE + 18 // 追加上载文件 /* 登陆步骤 login2Server | inputUserName | inputPassWord | 具体操作 | quit */ class CFTPManager { public : enum type { binary = 0x31, ascii, }; CFTPManager(void); virtual ~CFTPManager(void); // ! 登陆服务器 FTP_API login2Server(const std::string &serverIP); // !输入用户名 FTP_API inputUserName(const std::string &userName); // !输入密码 FTP_API inputPassWord(const std::string &password); // !退出FTP FTP_API quitServer(void); // !命令: PWD const std::string PWD(); // !设置传输格式 2进制 还是ascii方式传输 FTP_API setTransferMode(type mode); // !设置为被动模式 const std::string Pasv(); // ! 命令: DIR const std::string Dir(const std::string &path); // !命令 : CD FTP_API CD(const std::string &path); // !删除文件 FTP_API DeleteFile(const std::string &strRemoteFile); // ! 删除文件夹/目录 FTP_API DeleteDirectory(const std::string &strRemoteDir); // ! 创建目录/文件夹 FTP_API CreateDirectory(const std::string &strRemoteDir); // !重命名 FTP_API Rename(const std::string &strRemoteFile, const std::string &strNewFile); // !获取文件大小 long getFileLength(const std::string &strRemoteFile); // !关闭连接 void Close(int sock); // 下载文件 FTP_API Get(const std::string &strRemoteFile, const std::string &strLocalFile); // 上载文件 支持断电传送方式 FTP_API Put(const std::string &strRemoteFile, const std::string &strLocalFile); private: // !合成发送到服务器的命令 const std::string parseCommand(const unsigned int command, const std::string &strParam); // ! 建立连接 FTP_API Connect(int socketfd, const std::string &serverIP, unsigned int nPort); // ! 返回服务器信息 const std::string serverResponse(int sockfd); // !获取服务器数据 FTP_API getData(int fd, char *strBuf, unsigned long length); // !发送命令 FTP_API Send(int fd, const std::string &cmd); // !发送命令 FTP_API Send(int fd, const char *cmd, const size_t len); // !建立数据连接 FTP_API createDataLink(int data_fd); // !解析PASV模式返回的字符串获取FTP端口号和FTP服务器IP FTP_API ParseString(std::list<std::string> strArray, unsigned long & nPort ,std::string & strServerIp); // 打开本地文件 FILE *createLocalFile(const std::string &strLocalFile); // 下载文件 FTP_API downLoad(const std::string &strRemoteFile, const std::string &strLocalFile, const int pos = 0, const unsigned int length = 0); // 解析返回ftp命令的值 FTP_API parseResponse(const std::string &str); private: //!控制连接套接字 int m_cmdSocket; // !当前用户名 std::string m_strUserName; // !当前用户密码 std::string m_strPassWord; // !服务器的IP std::string m_strServerIP; // !服务器Port unsigned int m_nServerPort; // !服务器回应信息缓存 std::string m_strResponse; // !保存命令参数 std::string m_commandStr; // !当前使用的命令参数 unsigned int m_nCurrentCommand; // !是否登陆标志。 bool m_bLogin; }; #endif //源代码 // author: fuyl // 2011-04-06-13:58 #include "../Source/FTPManager.h" static int SplitString( std::string strSrc, std::list<std::string> &strArray , std::string strFlag) { int pos = 1; while((pos = (int)strSrc.find_first_of(strFlag.c_str())) > 0) { strArray.insert(strArray.end(), strSrc.substr(0 , pos)); strSrc = strSrc.substr(pos + 1, strSrc.length() - pos - 1); } strArray.insert(strArray.end(), strSrc.substr(0, strSrc.length())); return 0; } CFTPManager::CFTPManager(void): m_bLogin(false) { m_cmdSocket = socket(AF_INET, SOCK_STREAM, 0); } CFTPManager::~CFTPManager(void) { std::string strCmdLine = parseCommand(FTP_COMMAND_QUIT, ""); Send(m_cmdSocket, strCmdLine.c_str()); close(m_cmdSocket); m_bLogin = false; } FTP_API CFTPManager::login2Server(const std::string &serverIP) { std::string strPort; int pos = serverIP.find_first_of(":"); if (pos > 0) { strPort = serverIP.substr(pos + 1, serverIP.length() - pos); } else { pos = serverIP.length(); strPort = FTP_DEFAULT_PORT; } m_strServerIP = serverIP.substr(0, pos); m_nServerPort = atol(strPort.c_str()); trace("IP: %s port: %d\n", m_strServerIP.c_str(), m_nServerPort); if (Connect(m_cmdSocket, m_strServerIP, m_nServerPort) < 0) { return -1; } m_strResponse = serverResponse(m_cmdSocket); printf("@@@@Response: %s", m_strResponse.c_str()); return parseResponse(m_strResponse); } FTP_API CFTPManager::inputUserName(const std::string &userName) { std::string strCommandLine = parseCommand(FTP_COMMAND_USERNAME, userName); m_strUserName = userName; if (Send(m_cmdSocket, strCommandLine) < 0) { return -1; } m_strResponse = serverResponse(m_cmdSocket); printf("Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } FTP_API CFTPManager::inputPassWord(const std::string &password) { std::string strCmdLine = parseCommand(FTP_COMMAND_PASSWORD, password); m_strPassWord = password; if (Send(m_cmdSocket, strCmdLine) < 0) { return -1; } else { m_bLogin = true; m_strResponse = serverResponse(m_cmdSocket); printf("Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } } FTP_API CFTPManager::quitServer(void) { std::string strCmdLine = parseCommand(FTP_COMMAND_QUIT, ""); if (Send(m_cmdSocket, strCmdLine) < 0) { return -1; } else { m_strResponse = serverResponse(m_cmdSocket); printf("Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } } const std::string CFTPManager::PWD() { std::string strCmdLine = parseCommand(FTP_COMMAND_CURRENT_PATH, ""); if (Send(m_cmdSocket, strCmdLine.c_str()) < 0) { return ""; } else { return serverResponse(m_cmdSocket); } } FTP_API CFTPManager::setTransferMode(type mode) { std::string strCmdLine; switch (mode) { case binary: strCmdLine = parseCommand(FTP_COMMAND_TYPE_MODE, "I"); break; case ascii: strCmdLine = parseCommand(FTP_COMMAND_TYPE_MODE, "A"); break; default: break; } if (Send(m_cmdSocket, strCmdLine.c_str()) < 0) { assert(false); } else { m_strResponse = serverResponse(m_cmdSocket); printf("@@@@Response: %s", m_strResponse.c_str()); return parseResponse(m_strResponse); } } const std::string CFTPManager::Pasv() { std::string strCmdLine = parseCommand(FTP_COMMAND_PSAV_MODE, ""); if (Send(m_cmdSocket, strCmdLine.c_str()) < 0) { return ""; } else { m_strResponse = serverResponse(m_cmdSocket); return m_strResponse; } } const std::string CFTPManager::Dir(const std::string &path) { int dataSocket = socket(AF_INET, SOCK_STREAM, 0); if (createDataLink(dataSocket) < 0) { return ""; } // 数据连接成功 std::string strCmdLine = parseCommand(FTP_COMMAND_DIR, path); if (Send(m_cmdSocket, strCmdLine) < 0) { trace("@@@@Response: %s\n", serverResponse(m_cmdSocket).c_str()); close(dataSocket); return ""; } else { trace("@@@@Response: %s\n", serverResponse(m_cmdSocket).c_str()); m_strResponse = serverResponse(dataSocket); trace("@@@@Response: \n%s\n", m_strResponse.c_str()); close(dataSocket); return m_strResponse; } } FTP_API CFTPManager::CD(const std::string &path) { assert(m_cmdSocket != INVALID_SOCKET); std::string strCmdLine = parseCommand(FTP_COMMAND_CHANGE_DIRECTORY, path); if (Send(m_cmdSocket, strCmdLine) < 0) { return -1; } m_strResponse = serverResponse(m_cmdSocket); trace("@@@@Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } FTP_API CFTPManager::DeleteFile(const std::string &strRemoteFile) { assert(m_cmdSocket != INVALID_SOCKET); std::string strCmdLine = parseCommand(FTP_COMMAND_DELETE_FILE, strRemoteFile); if (Send(m_cmdSocket, strCmdLine) < 0) { return -1; } m_strResponse = serverResponse(m_cmdSocket); printf("@@@@Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } FTP_API CFTPManager::DeleteDirectory(const std::string &strRemoteDir) { assert(m_cmdSocket != INVALID_SOCKET); std::string strCmdLine = parseCommand(FTP_COMMAND_DELETE_DIRECTORY, strRemoteDir); if (Send(m_cmdSocket, strCmdLine) < 0) { return -1; } m_strResponse = serverResponse(m_cmdSocket); trace("@@@@Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } FTP_API CFTPManager::CreateDirectory(const std::string &strRemoteDir) { assert(m_cmdSocket != INVALID_SOCKET); std::string strCmdLine = parseCommand(FTP_COMMAND_CREATE_DIRECTORY, strRemoteDir); if (Send(m_cmdSocket, strCmdLine) < 0) { return -1; } m_strResponse = serverResponse(m_cmdSocket); trace("@@@@Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } FTP_API CFTPManager::Rename(const std::string &strRemoteFile, const std::string &strNewFile) { assert(m_cmdSocket != INVALID_SOCKET); std::string strCmdLine = parseCommand(FTP_COMMAND_RENAME_BEGIN, strRemoteFile); Send(m_cmdSocket, strCmdLine); trace("@@@@Response: %s\n", serverResponse(m_cmdSocket).c_str()); Send(m_cmdSocket, parseCommand(FTP_COMMAND_RENAME_END, strNewFile)); m_strResponse = serverResponse(m_cmdSocket); trace("@@@@Response: %s\n", m_strResponse.c_str()); return parseResponse(m_strResponse); } long CFTPManager::getFileLength(const std::string &strRemoteFile) { assert(m_cmdSocket != INVALID_SOCKET); std::string strCmdLine = parseCommand(FTP_COMMAND_FILE_SIZE, strRemoteFile); if (Send(m_cmdSocket, strCmdLine) < 0) { return -1; } m_strResponse = serverResponse(m_cmdSocket); trace("@@@@Response: %s\n", m_strResponse.c_str()); std::string strData = m_strResponse.substr(0, 3); unsigned long val = atol(strData.c_str()); if (val == 213) { strData = m_strResponse.substr(4); trace("strData: %s\n", strData.c_str()); val = atol(strData.c_str()); return val; } return -1; } void CFTPManager::Close(int sock) { shutdown(sock, SHUT_RDWR); close(sock); sock = INVALID_SOCKET; } FTP_API CFTPManager::Get(const std::string &strRemoteFile, const std::string &strLocalFile) { return downLoad(strRemoteFile, strLocalFile); } FTP_API CFTPManager::Put(const std::string &strRemoteFile, const std::string &strLocalFile) { std::string strCmdLine; const unsigned long dataLen = FTP_DEFAULT_BUFFER; char strBuf[dataLen] = {0}; unsigned long nSize = getFileLength(strRemoteFile); unsigned long nLen = 0; // struct stat sBuf; // // assert(stat(strLocalFile.c_str(), &sBuf) == 0); // trace("size: %d\n", sBuf.st_size); FILE *pFile = fopen(strLocalFile.c_str(), "rb"); // 以只读方式打开 且文件必须存在 assert(pFile != NULL); int data_fd = socket(AF_INET, SOCK_STREAM, 0); assert(data_fd != -1); if (createDataLink(data_fd) < 0) { return -1; } if (nSize == -1) { strCmdLine = parseCommand(FTP_COMMAND_UPLOAD_FILE, strRemoteFile); } else { strCmdLine = parseCommand(FTP_COMMAND_APPEND_FILE, strRemoteFile); } if (Send(m_cmdSocket, strCmdLine) < 0) { Close(data_fd); return -1; } trace("@@@@Response: %s\n", serverResponse(m_cmdSocket).c_str()); fseek(pFile, nSize, SEEK_SET); while (!feof(pFile)) { nLen = fread(strBuf, 1, dataLen, pFile); if (nLen < 0) { break; } if (Send(data_fd, strBuf) < 0) { Close(data_fd); return -1; } } trace("@@@@Response: %s\n", serverResponse(data_fd).c_str()); Close(data_fd); trace("@@@@Response: %s\n", serverResponse(m_cmdSocket).c_str()); fclose(pFile); return 0; } const std::string CFTPManager::parseCommand(const unsigned int command, const std::string &strParam) { if (command < FTP_COMMAND_BASE || command > FTP_COMMAND_END) { return ""; } std::string strCommandLine; m_nCurrentCommand = command; m_commandStr.clear(); switch (command) { case FTP_COMMAND_USERNAME: strCommandLine = "USER "; break; case FTP_COMMAND_PASSWORD: strCommandLine = "PASS "; break; case FTP_COMMAND_QUIT: strCommandLine = "QUIT "; break; case FTP_COMMAND_CURRENT_PATH: strCommandLine = "PWD "; break; case FTP_COMMAND_TYPE_MODE: strCommandLine = "TYPE "; break; case FTP_COMMAND_PSAV_MODE: strCommandLine = "PASV "; break; case FTP_COMMAND_DIR: strCommandLine = "LIST "; break; case FTP_COMMAND_CHANGE_DIRECTORY: strCommandLine = "CWD "; break; case FTP_COMMAND_DELETE_FILE: strCommandLine = "DELE "; break; case FTP_COMMAND_DELETE_DIRECTORY: strCommandLine = "RMD "; break; case FTP_COMMAND_CREATE_DIRECTORY: strCommandLine = "MKD "; break; case FTP_COMMAND_RENAME_BEGIN: strCommandLine = "RNFR "; break; case FTP_COMMAND_RENAME_END: strCommandLine = "RNTO "; break; case FTP_COMMAND_FILE_SIZE: strCommandLine = "SIZE "; break; case FTP_COMMAND_DOWNLOAD_FILE: strCommandLine = "RETR "; break; case FTP_COMMAND_DOWNLOAD_POS: strCommandLine = "RE
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服