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类实现的功能已经在声明头文件中进行了注释,下面分别介绍类功能函数的实现代码: