接上篇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. 翻译:Addressing tiles: same tile bounds with different indexes

    原文链接:http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/ Addressing tiles: same ...

  2. 分布式版本管理git学习资料整理推荐

    一.什么是git? Git is a free and open source distributed version control system designed to handle everyt ...

  3. Java模板模式

    模板类 package com.ietree.designpattern.template; /** * 模板类 * * @author Root */ public abstract class S ...

  4. 3.9 Templates -- Input Helpers

    一.Input Helpers Ember中{{input}}和{{textarea}}是创建常规表单控件最简单的方法. {{input}}包裹内建的Ember.TextField和Ember.Che ...

  5. SEO笔记:Anatomy of a URL

    Dr. Peter J. Meyers 原文链接:https://moz.com/blog/seo-cheat-sheet-anatomy-of-a-url 原文主要通过对比讲解 SEO优化后的URL ...

  6. 001-mybatis框架

    架构分析: 1. 读SqlMapConfig.xml. 当调用与数据库有关的操作的时候,会读SqlMapConfig.xml文件中的信息,里面配置了Mybatis的运行环境信息,加载mapper.xm ...

  7. Codeforces Round #523 (Div. 2) Solution

    A. Coins Water. #include <bits/stdc++.h> using namespace std; int n, s; int main() { while (sc ...

  8. 2018 Multi-University Training Contest 6 Solution

    A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) ...

  9. 20155310 2016-2017-2 《Java程序设计》第七周学习总结

    20155310 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十三章 时间与日期 认识时间与日期 •时间的度量 •GMT(格林威治标准时间):现在不是标 ...

  10. Mysql优化原则_小表驱动大表IN和EXISTS的合理利用

    //假设一个for循环 ; $i < ; $i++) { ; $i < ; $j++) { } } ; $i < ; $i++) { ; $i < ; $j++) { } } ...