接上篇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. 001-ant design安装及快速入门【基于纯antd的基本项目搭建】

    一.安装使用 1.1.安装 推荐使用 npm 或 yarn 的方式进行开发 npm install antd --save yarn add antd 1.2.浏览器引入 在浏览器中使用 script ...

  2. Elasticsearch查询规则(一)match和term

    es种有两种查询模式,一种是像传递URL参数一样去传递查询语句,被称为简单搜索或查询字符串(query string)搜索,比如 GET /megacorp/employee/_search //查询 ...

  3. 单机部署PXC

    在一台机器上安装PXC Linux:centos 7     IP:192.168.30.221 PXC版本:Percona-XtraDB-Cluster-5.7.17-rel13-29.20.3.L ...

  4. Android初体验之Monkey和MonkeyRunner

    原文地址https://blog.csdn.net/mad1989/article/details/38087737 Monkey 什么是Monkey Monkey是Android中的一个命令行工具, ...

  5. java猫和猫的名字

    这篇文章之所以叫猫和猫的名字,是因为是以猫为案例来讲的 主要的内容就是java构造函数和参数的传递 class Animal { public static String name; Animal(S ...

  6. NiFi REST API 的使用

    一.概述 为方便用户使用 NiFi 进行二次开发,NiFi 为开发者提供了 NIFI REST API. 关于 API 的详细介绍,请参见官网 NIFI REST API.这里仅给出一些注意的小细节. ...

  7. uva672

      Gangsters  N gangsters are going to a restaurant. The i-th gangster comes at the time Ti and has t ...

  8. nginx自动生成缩略图

    网站上常常一张图片,多个地方需要使用不同的尺寸,一般的方案是上传的时候,根据不同的尺寸用程序生成多张图片. 这么做有两个缺点: 1.如果需要新的尺寸图片的话,只能遍历下数据库,重新生成一次图片. 2. ...

  9. Golang 中的指针 - Pointer

    http://www.cnblogs.com/jasonxuli/p/6802289.html   Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int ...

  10. nw.js node-webkit系列(17)怎样打包和分发你的应用

    原文链接:http://blog.csdn.net/zeping891103/article/details/50790180