C++实现的FTP案例代码解析

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

发表评论0条 】
网友评论(共?条评论)..
C++实现的FTP案例代码解析