市场营销linux FTP 客户端_第1页
市场营销linux FTP 客户端_第2页
市场营销linux FTP 客户端_第3页
市场营销linux FTP 客户端_第4页
市场营销linux FTP 客户端_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#ifndef CLIENT_H_#define CLIENT_H_#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define INVALID_SOCKET-1#define FTP_APIint#define MAX_PATH260#define traceprintf#define FTP_PARAM_BASE#define FTP_DEFAULT_PORT21/FT

2、P默认端口号#define FTP_DEFAULT_BUFFER1024*4/FTP下载缓冲默认大小#define FTP_DEFAULT_PATH/mnt/dvs/FTP默认保存路径#define FTP_COMMAND_BASE1000#define FTP_COMMAND_ENDFTP_COMMAND_BASE + 30#define FTP_COMMAND_USERNAMEFTP_COMMAND_BASE + 1/用户名#define FTP_COMMAND_PASSWORDFTP_COMMAND_BASE + 2/密码#define FTP_COMMAND_QUITFTP_COMMA

3、ND_BASE + 3/退出#define FTP_COMMAND_CURRENT_PATHFTP_COMMAND_BASE + 4/ 获取文件路径#define FTP_COMMAND_TYPE_MODEFTP_COMMAND_BASE + 5/ 改变传输模式#define FTP_COMMAND_PSAV_MODEFTP_COMMAND_BASE + 6/ 被动端口模式#define FTP_COMMAND_DIRFTP_COMMAND_BASE + 7/ 获取文件列表#define FTP_COMMAND_CHANGE_DIRECTORY FTP_COMMAND_BASE + 8/ 改变

4、路径#define FTP_COMMAND_DELETE_FILEFTP_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_BA

5、SE + 13/ 重命名结束#define FTP_COMMAND_FILE_SIZEFTP_COMMAND_BASE + 14/ 获取文件大小#define FTP_COMMAND_DOWNLOAD_POSFTP_COMMAND_BASE + 15/ 下载文件从指定位置开始#define FTP_COMMAND_DOWNLOAD_FILEFTP_COMMAND_BASE + 16/ 下载文件#define FTP_COMMAND_UPLOAD_FILEFTP_COMMAND_BASE + 17/ 上传文件#define FTP_COMMAND_APPEND_FILEFTP_COMMAND_B

6、ASE + 18/ 追加上载文件/* 登陆步骤login2Server|inputUserName|inputPassWord| 具体操作| quit*/class CFTPManager public :enum type binary = 0 x31,ascii,;CFTPManager(void);virtual CFTPManager(void);/ ! 登陆服务器FTP_API login2Server(const std:string &serverIP);/ !输入用户名FTP_API inputUserName(const std:string &userName);/ !输入

7、密码FTP_API inputPassWord(const std:string &password);/ !退出FTPFTP_API quitServer(void);/ !命令: PWDconst std:string PWD();/ !设置传输格式 2进制 还是ascii方式传输FTP_API setTransferMode(type mode);/ !设置为被动模式const std:string Pasv();/ ! 命令: DIRconst std:string Dir(const std:string &path);/ !命令 : CDFTP_API CD(const std:s

8、tring &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);/ !获取文件大

9、小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 parse

10、Command(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 f

11、d, 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服务器IPFTP_API ParseString(std:list strArray, unsigned long & nPort ,std:string & strServerIp);/ 打开本地文件FILE *createLocalFile(const std:stri

12、ng &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:/!控制连接套接字intm_cmdSocket;/ !当前用户名std:string m_strUserName;/ !当前用户密码std:string

13、m_strPassWord;/ !服务器的IPstd:string m_strServerIP;/ !服务器Portunsigned int m_nServerPort;/ !服务器回应信息缓存std:string m_strResponse;/ !保存命令参数std:string m_commandStr;/ !当前使用的命令参数unsigned int m_nCurrentCommand;/ !是否登陆标志。boolm_bLogin;#endif/源代码/ author: fuyl/ 2011-04-06-13:58#include ./Source/FTPManager.hstatic

14、int SplitString( std:string strSrc, std:list &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.

15、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 CFTPM

16、anager: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);elsepos = serverIP.length();strPort = FTP_DEFAULT_PORT;m_strServerIP = serverIP.substr(0, pos);m_nServerPort = atol(strPort.c_st

17、r();trace(IP: %s port: %dn, 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();returnparseResponse(m_strResponse);FTP_API CFTPManager:inputUserName(const std:s

18、tring &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: %sn, m_strResponse.c_str();return parseResponse(m_strResponse);FTP_API CFTP

19、Manager:inputPassWord(const std:string &password)std:string strCmdLine = parseCommand(FTP_COMMAND_PASSWORD, password);m_strPassWord = password;if (Send(m_cmdSocket, strCmdLine) 0)return -1;elsem_bLogin = true;m_strResponse = serverResponse(m_cmdSocket);printf(Response: %sn, m_strResponse.c_str();ret

20、urn parseResponse(m_strResponse);FTP_API CFTPManager:quitServer(void)std:string strCmdLine = parseCommand(FTP_COMMAND_QUIT, );if (Send(m_cmdSocket, strCmdLine) 0)return -1;elsem_strResponse = serverResponse(m_cmdSocket);printf(Response: %sn, m_strResponse.c_str();return parseResponse(m_strResponse);

21、const std:string CFTPManager:PWD()std:string strCmdLine = parseCommand(FTP_COMMAND_CURRENT_PATH, );if (Send(m_cmdSocket, strCmdLine.c_str() 0)return ;elsereturn serverResponse(m_cmdSocket);FTP_API CFTPManager:setTransferMode(type mode)std:string strCmdLine;switch (mode)case binary:strCmdLine = parse

22、Command(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);elsem_strResponse = serverResponse(m_cmdSocket);printf(Response: %s, m_strResponse.c_str();return parseResponse(m_strRes

23、ponse);const std:string CFTPManager:Pasv()std:string strCmdLine = parseCommand(FTP_COMMAND_PSAV_MODE, );if (Send(m_cmdSocket, strCmdLine.c_str() 0)return ;elsem_strResponse = serverResponse(m_cmdSocket);return m_strResponse;const std:string CFTPManager:Dir(const std:string &path)int dataSocket = soc

24、ket(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: %sn, serverResponse(m_cmdSocket).c_str();close(dataSocket);return ;elsetrace(Response: %sn, serverResponse(m_c

25、mdSocket).c_str();m_strResponse = serverResponse(dataSocket);trace(Response: n%sn, 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)

26、;if (Send(m_cmdSocket, strCmdLine) 0)return -1;m_strResponse = serverResponse(m_cmdSocket);trace(Response: %sn, m_strResponse.c_str();return parseResponse(m_strResponse);FTP_API CFTPManager:DeleteFile(const std:string &strRemoteFile)assert(m_cmdSocket != INVALID_SOCKET);std:string strCmdLine = parse

27、Command(FTP_COMMAND_DELETE_FILE, strRemoteFile);if (Send(m_cmdSocket, strCmdLine) 0)return -1;m_strResponse = serverResponse(m_cmdSocket);printf(Response: %sn, m_strResponse.c_str();return parseResponse(m_strResponse);FTP_API CFTPManager:DeleteDirectory(const std:string &strRemoteDir)assert(m_cmdSoc

28、ket != 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: %sn, m_strResponse.c_str();return parseResponse(m_strResponse);FTP_API CFTPManager:CreateD

29、irectory(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: %sn, m_strResponse.c_str();return p

30、arseResponse(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: %sn, serverResponse(m

31、_cmdSocket).c_str();Send(m_cmdSocket, parseCommand(FTP_COMMAND_RENAME_END, strNewFile);m_strResponse = serverResponse(m_cmdSocket);trace(Response: %sn, m_strResponse.c_str();return parseResponse(m_strResponse);long CFTPManager:getFileLength(const std:string &strRemoteFile)assert(m_cmdSocket != INVAL

32、ID_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: %sn, m_strResponse.c_str();std:string strData = m_strResponse.substr(0, 3);unsigned long val = atol(strData.

33、c_str();if (val = 213)strData = m_strResponse.substr(4);trace(strData: %sn, 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:s

34、tring &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 strBufdataLen = 0;unsigned long nSize = getFileLength(strRemoteFile);un

35、signed long nLen = 0;/ struct stat sBuf;/ / assert(stat(strLocalFile.c_str(), &sBuf) = 0);/ trace(size: %dn, 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

36、_fd) 0)return -1;if (nSize = -1)strCmdLine = parseCommand(FTP_COMMAND_UPLOAD_FILE, strRemoteFile);elsestrCmdLine = parseCommand(FTP_COMMAND_APPEND_FILE, strRemoteFile);if (Send(m_cmdSocket, strCmdLine) 0)Close(data_fd);return -1;trace(Response: %sn, serverResponse(m_cmdSocket).c_str();fseek(pFile, n

37、Size, 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: %sn, serverResponse(data_fd).c_str();Close(data_fd);trace(Response: %sn, serverResponse(m_cmdSocket).c_str();fclose(pFile);return 0;const s

38、td:string CFTPManager:parseCommand(const unsigned int command, const std:string &strParam)if (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:st

39、rCommandLine = 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;ca

40、se 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

41、;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 = REST ;break;case FTP_COMMAND_UPLOAD_FILE:strCommandLine = STOR ;break;case FTP_

42、COMMAND_APPEND_FILE:strCommandLine = APPE ;break;default :break;strCommandLine += strParam;strCommandLine += rn;m_commandStr = strCommandLine;trace(parseCommand: %sn, m_commandStr.c_str();return m_commandStr;FTP_API CFTPManager:Connect(int socketfd, const std:string &serverIP, unsigned int nPort)if

43、(socketfd = INVALID_SOCKET)return -1;unsigned int argp = 1;int error = -1;int len = sizeof(int);struct sockaddr_in addr;bool ret = false;timeval stime;fd_set set;ioctl(socketfd, FIONBIO, &argp); /设置为非阻塞模式memset(&addr, 0, sizeof(struct sockaddr_in);addr.sin_family = AF_INET;addr.sin_port= htons(nPort

44、);addr.sin_addr.s_addr = inet_addr(serverIP.c_str();bzero(&(addr.sin_zero), 8);trace(Address: %s %dn, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port);if (connect(socketfd, (struct sockaddr*)&addr, sizeof(struct sockaddr) = -1) /若直接返回 则说明正在进行TCP三次握手stime.tv_sec = 20; /设置为1秒超时stime.tv_usec = 0;FD_ZERO(

45、&set);FD_SET(socketfd, &set);if (select(socketfd + 1, NULL, &set, NULL, &stime) 0) /在这边等待 阻塞 返回可以读的描述符 或者超时返回0 或者出错返回-1getsockopt(socketfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t*)&len);if (error = 0)ret = true;elseret = false;elsetrace(Connect Immediately!n);ret = true;argp = 0;ioctl(socketfd, FI

46、ONBIO, &argp);if (!ret)close(socketfd);fprintf(stderr, cannot connect server!n);return -1;/fprintf(stdout, Connect!n);return 0;const std:string CFTPManager:serverResponse(int sockfd)if (sockfd = INVALID_SOCKET)return ;int nRet = -1;char bufMAX_PATH = 0;m_strResponse.clear();while (nRet = getData(soc

47、kfd, buf, MAX_PATH) 0)bufMAX_PATH - 1 = 0;m_strResponse += buf;return m_strResponse;FTP_API CFTPManager:getData(int fd, char *strBuf, unsigned long length)assert(strBuf != NULL);if (fd = INVALID_SOCKET)return -1;memset(strBuf, 0, length);timeval stime;int nLen;stime.tv_sec = 1;stime.tv_usec = 0;fd_s

48、etreadfd;FD_ZERO( &readfd );FD_SET(fd, &readfd );if (select(fd + 1, &readfd, 0, 0, &stime) 0)if (nLen = recv(fd, strBuf, length, 0) 0)return nLen;elsereturn -2;return 0;FTP_API CFTPManager:Send(int fd, const std:string &cmd)if (fd = INVALID_SOCKET)return -1;return Send(fd, cmd.c_str(), cmd.length();

49、FTP_API CFTPManager:Send(int fd, const char *cmd, const size_t len)if(FTP_COMMAND_USERNAME != m_nCurrentCommand) &(FTP_COMMAND_PASSWORD != m_nCurrentCommand)&(!m_bLogin)return -1;timeval timeout;timeout.tv_sec = 1;timeout.tv_usec = 0;fd_set writefd;FD_ZERO(&writefd); FD_SET(fd, &writefd);if(select(f

50、d + 1, 0, &writefd , 0 , &timeout) 0)size_t nlen = len; int nSendLen = 0; while (nlen 0) nSendLen = send(fd, cmd , (int)nlen , 0);if(nSendLen = -1) return -2; nlen = nlen - nSendLen;cmd += nSendLen;return 0;return -1;FTP_API CFTPManager:createDataLink(int data_fd)assert(data_fd != INVALID_SOCKET);st

51、d:string strData;unsigned long nPort = 0 ;std:string strServerIp ; std:list strArray ;std:string parseStr = Pasv();if (parseStr.size() = 0)return -1;/trace(parseInfo: %sn, parseStr.c_str();size_t nBegin = parseStr.find_first_of();size_t nEnd = parseStr.find_first_of();strData = parseStr.substr(nBegi

52、n + 1, nEnd - nBegin - 1);/trace(ParseAfter: %sn, strData.c_str();if( SplitString( strData , strArray , , ) 0)return -1;if( ParseString( strArray , nPort , strServerIp) 0)return -1;/trace(nPort: %ld IP: %sn, nPort, strServerIp.c_str();if (Connect(data_fd, strServerIp, nPort) 0)return -1;return 0;FTP_API CFTPManager:ParseString(std:list strArray, unsigned long & nPort ,std:string & strServerIp)if (strArray.size() 6 )return -1 ;std

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论