2016-01-05 19:46:22|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
使用 Socket 通信实现 FTP 客户端程序介绍了FTP通信的一些基本原理,本文通过实际的例子,介绍C++实现FTP功能的一个实用程序,本文重在介绍FTP传输的基本原理,程序的效率方面有待优化,还原大家批评指正。
为了方便项目使用,我们将FTP相关功能封装为一个名为CFTP的工具类,并编译在一个dll中,供其它程序调用,CFTP类的声明如下:
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 FTP_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // FTP_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #pragma once #ifdef FTP_EXPORTS #define FTP_API __declspec(dllexport) #else #define FTP_API __declspec(dllimport) #endif #include "winsock2.h" #pragma comment(lib,"ws2_32.lib") #include "stdio.h" #include <string> #include <vector> // 此类是从 FTP.dll 导出的 class FTP_API CFTP { public: struct FILE_ITEM{ char type; //目录-D,文件-F; size_t fSize; //文件(目录)大小; std::string fName; //文件(目录)的名称 }; public: CFTP(const char* ip, const char* logFile="ftp_log.dat"); ~CFTP(void); //连接ftp服务器 int ftp_connect(int timeout = 300); //登录ftp服务器 int ftp_login(const char* user,const char* pass); //显示当前目录 int ftp_pwd(char* buff); //更改目录 int ftp_cd(const char* dir); //返回上层目录 int ftp_cdup(); //创建目录 int ftp_mkdir(const char* dir); //删除目录 int ftp_rmdir(const char* dir); //数据传输模式 int ftp_setpasv(); //上传目录 int ftp_upload_dir(const char* localpath,const char* remotepath,size_t buf_size = 1024); //上传文件 int ftp_upload(const char* localfile,const char* remotepath,const char* remotefilename,size_t buf_size = 1024); //获取文件大小 size_t ftp_getFileSize(const char* remoteFileName); //列出FTP服务器目录中的文件和子目录 int ftp_list_dir(const char* remotePath,std::vector<FILE_ITEM>& vecFileList); //递归创建本地目录 int local_create_dir(const char* localPath); //下载目录 int ftp_download_dir(const char* localPath,const char* remotePath,size_t buf_size = 1024); //下载文件 int ftp_download(const char* localfile,const char* remotefile,size_t buf_size = 1024); //退出登录 int ftp_quit(); //buf_recv:接受返回内容的缓存区 //buf_length:缓存区长度 int ftp_sendcmd(const char* p_cmd,char* buf_recv,size_t buf_length); //从服务器接收返回内容 int recv_buf(char* recv_buf,int buf_length); private: SOCKET m_sockctrl;//控制连接socket SOCKET m_sockdata;//数据连接socket char m_cmd[256];//存放指令 char m_resp[1024];//存放返回语句 char m_ip[64];//保存ip FILE* m_pLogFile; //命令日志文件 int ftp_mkdirSingle(const char* dir); //保存日志文件 void save_log(const char* str_log, FILE* pLogFile); //得到状态码 int get_state_code(const char* p_buf); }; extern FTP_API int nFTP; FTP_API int fnFTP(void);
CFTP类实现的功能已经在声明头文件中进行了注释,下面分别介绍类功能函数的实现代码: