接上篇http://www.cnblogs.com/jzincnblogs/p/5213978.html,这篇主要记录编程方面的重点。

  客户端使用了Windows Socket提供的API,支持上传、下载、删除、查看文件,断点续传,二进制/ASCII模式切换,被动模式切换,记录操作日志等功能。

  代码包含的类如下:

    ①MySocket类,对SOCKET进行了简单的封装

 //对winsock SOCKET的封装
class MySocket
{
public:
MySocket();
//~MySocket();
//重载向SOCKET类型转换的运算符
operator SOCKET() const;
//设置地址信息
void SetAddrInfo(std::string host, int port);
bool Connect();
//bool Disconnect();
bool Create(int af = AF_INET, int type = SOCK_STREAM, int protocol = IPPROTO_TCP);
bool Close();
//获取主机ip
std::string GetHostIP() const;
//获取主机端口
int GetPort() const;
private:
SOCKET sock;
SOCKADDR_IN addr_in; //记录连接的服务器的地址信息
bool conn_flag; //判断是否已连接
};

    ②Record类,存储了客户端与服务器的交互信息的数据结构

 //枚举类型,CMD代表命令信息,RES代表响应信息
enum log_type { CMD = , RES = }; //与服务器的交互信息
class Record
{
friend std::ostream & operator<<(std::ostream &os, const Record &rcd);
public:
Record(log_type t, std::string m);
Record(const Record &rcd);
Record & operator=(const Record &rcd);
//获取信息内容
std::string GetMsg() const;
private:
log_type type; //信息类型
std::string msg;
};

    ③Logger类,负责控制传输端口的发送命令,接收服务器响应,记录、显示操作日志等功能,包含一个Record类的vector,用于存储此次程序运行的信息

 class Logger
{
public:
Logger(const std::string &host, int port);
~Logger();
Logger(const Logger &logger) = delete;
Logger & operator=(const Logger &logger) = delete;
//发送命令
void SendCmd(const std::string &cmd);
//接收来自服务器的响应
void RecvResponse();
//记录信息
void Log(log_type type, const std::string &cmd);
//获取最后一条交互信息,用于验证命令是否执行成功
std::string GetLastLog() const;
void DisplayLog() const;
private:
MySocket sock_cmd; //发送接收命令的socket
std::vector<Record> vec_rcd; //保存此次客户端运行的交互信息
//将信息记录到文本文件中
void WriteRecord();
};

    ④File类,用于存储文件信息的数据结构

 class File
{
friend std::ostream & operator<<(std::ostream &os, const File &file);
public:
//斜杠代表根目录
File(const std::string &n = "", const std::string &t = "", const int &s = , const std::string &p = "/");
int GetSize() const;
private:
std::string name;
std::string path;
std::string create_time;
int size;
};

    ⑤FTPClient类,代码的核心类

 class FTPClient
{
public:
FTPClient(const string &host, int port);
bool Login(const string &usr, const string &pwd);
//进入被动模式
bool EnterPasvMode();
//更新文件列表
void UpdateFileList();
//获取指定文件信息
File GetFileInfo(const string &f);
void DisplayLog() const;
//以二进制格式下载文件
bool DownloadBinary(const string &f);
//以ASCII格式下载文件
bool DownloadASCII(const string &f);
//上传文件
bool Upload(const string &f, bool binary);
//删除指定文件
bool Delete(const string &f);
//退出客户端
bool Quit();
private:
Logger logger;
MySocket sock_data; //用于传输数据的socket
string host;
int port;
//
void GetFileList();
bool EnterASCIIMode(); //进入ASCII模式
bool EnterBinaryMode(); //进入二进制模式
};

使用c++实现一个FTP客户端(二)的更多相关文章

  1. 使用c++实现一个FTP客户端(一)

    之前使用c++实现了一个FTP客户端,在这里做一些记录. 一.需要注意的几点 ①FTP是一种文件传输协议,基于TCP,所以客户端与服务器建立的连接是可靠.安全的,并且要经过三次握手的过程. ②FTP传 ...

  2. 使用c++实现一个FTP客户端(三)

    接上篇:http://www.cnblogs.com/jzincnblogs/p/5217688.html,这篇主要记录编程过程中需要注意的地方以及遇到的一些问题及解决方法. 一.gethostbyn ...

  3. 基于线程开发一个FTP服务器

    一,项目题目:基于线程开发一个FTP服务器 二,项目要求: 基本要求: 1.用户加密认证   2.允许同时多用户登录   3.每个用户有自己的家目录 ,且只能访问自己的家目录   4.对用户进行磁盘配 ...

  4. Socket网络编程--FTP客户端

    Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...

  5. Socket网络编程--FTP客户端(1)(Windows)

    已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...

  6. Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)

    已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...

  7. Python的网络编程[1] -> FTP 协议[2] -> 使用 ftplib 建立 FTP 客户端

    使用 ftplib 建立 FTP 客户端 用于建立FTP Client,与 pyftplib 建立的 Server 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 客户端 1. 模块信息 1 ...

  8. 用edtftpj实现Java FTP客户端工具

    edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活.edtftpj有多种版本,分别是java..net和js版本.对于Java版的有一个免费版本. ...

  9. python3+ftplib实现ftp客户端

    一.程序说明 1.1 程序实现关键点 python实现ftp客户端,主要会遇到以下四个问题: 第一个问题是使用什么包实现----我们这里是使用标准库中的ftplib 第二个问题是怎么连接登录ftp服务 ...

随机推荐

  1. python之threading.local

    简述: threading.local是全局变量但是它的值却在当前调用它的线程当中 作用: 在threading module中,有一个非常特别的类local.一旦在主线程实例化了一个local,它会 ...

  2. Linux下编译安装Nginx1.12

    [准备工作] 所有操作需要在root用户下 本机测试案例系统信息:centos7.3 安装路径:/usr/local/nginx [安装Nginx] 先安装如下依赖包 $ yum install gc ...

  3. samba文件共享服务配置(multiuser机制)二 (共两节)

    smb客户端的multiuser挂载技术 --管理员只需要作一次挂载 --客户端在访问挂载点时,若需要不同权限,可临时切换新的共享用户[无需重新挂载] 实现方式 --挂载smb共享时启用multius ...

  4. C++ Builder创建和调用dll中的资源

    程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...

  5. javascript模式(1)--私有成员

    javascript是基于对象的一门语言,没有想java等语言那样子拥有封装的特性.但是javascript可以通过闭包来进行模拟. 1.构造函数与私有成员 可以用构造函数形成一个闭包,实现内部成员的 ...

  6. CentOS7搭建Gitlab详细过程

    1.参见Gitlab官网说明 原文地址:https://about.gitlab.com/install/#centos-7   1.安装并配置必要的依赖项 在CentOS 7(和RedHat / O ...

  7. Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

    系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe ...

  8. Python笔记 #09# Basic plots with matplotlib

    源:DataCamp 气泡的大小表示人口的多少,横坐标表示人均GDP(美元),纵坐标表示预期寿命.-- 作者:Hans Rosling Python 中有许许多多用于可视化的包,而 matplotli ...

  9. 从官网学习Node.js FS模块方法速查

    最新文档请查看仓库 https://github.com/wangduandu... 1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参 ...

  10. Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的

    首先,我们先写一个简单的C语言程序,如下: int g(int x) { return x +3; } int f(int x) { return g(x); } int main(void) { r ...