使用c++实现一个FTP客户端(二)
接上篇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客户端(二)的更多相关文章
- 使用c++实现一个FTP客户端(一)
之前使用c++实现了一个FTP客户端,在这里做一些记录. 一.需要注意的几点 ①FTP是一种文件传输协议,基于TCP,所以客户端与服务器建立的连接是可靠.安全的,并且要经过三次握手的过程. ②FTP传 ...
- 使用c++实现一个FTP客户端(三)
接上篇:http://www.cnblogs.com/jzincnblogs/p/5217688.html,这篇主要记录编程过程中需要注意的地方以及遇到的一些问题及解决方法. 一.gethostbyn ...
- 基于线程开发一个FTP服务器
一,项目题目:基于线程开发一个FTP服务器 二,项目要求: 基本要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
- Socket网络编程--FTP客户端(1)(Windows)
已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...
- Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)
已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...
- Python的网络编程[1] -> FTP 协议[2] -> 使用 ftplib 建立 FTP 客户端
使用 ftplib 建立 FTP 客户端 用于建立FTP Client,与 pyftplib 建立的 Server 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 客户端 1. 模块信息 1 ...
- 用edtftpj实现Java FTP客户端工具
edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活.edtftpj有多种版本,分别是java..net和js版本.对于Java版的有一个免费版本. ...
- python3+ftplib实现ftp客户端
一.程序说明 1.1 程序实现关键点 python实现ftp客户端,主要会遇到以下四个问题: 第一个问题是使用什么包实现----我们这里是使用标准库中的ftplib 第二个问题是怎么连接登录ftp服务 ...
随机推荐
- PAT 1111 Online Map[Dijkstra][dfs]
1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...
- Bootstrap fileinput v1.0(ssm版)
前言bootstrap fileinput是一个很好的文件上传插件.但是官方不出api,这就尴尬了.百度一下,每个人写法都不相同,好多代码本身都是错的.我修改后才能跑起来.综上所述:所以今天我摸索了一 ...
- 19重定向管道与popen模型
重定向 dup2 int dup(int fd) 重定向文件描述符 int newFd = dup(STDOUT_FILENO) newFd 指向 stdout int dup2(int fd1, ...
- hdu6158 The Designer
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6158 题目: The Designer Time Limit: 8000/4000 MS (J ...
- hdu 5140 主席树
这题说的是每个员工有工资 水平 在公司待的年限这几个属性,有大量的查询 查的是在一定的水平和工作年限的工人总工资是多少 这个思路是比较简单的我们按照他们的水平排序,排完后,使用主席树不断地往里面插,然 ...
- Java面试:投行的15个多线程和并发面试题
多线程和并发问题已成为各种 Java 面试中必不可少的一部分.如果你准备参加投行的 Java 开发岗位面试,比如巴克莱银行(Barclays).花旗银行(Citibank).摩根史坦利投资公司(Mor ...
- 20165207 学习基础与C语言基础调查反馈
文章阅读体会与学习调查反馈 文章阅读体会 我在娄老师的文章里了解到了"做中学"的概念.并且通过娄老师慷慨地分享的相关经验,我对于它有了进一步的理解以及体会.以下是我收获以及我的感想 ...
- Qt信号和槽连接方式的选择
看了下Qt的帮助文档,发现connect函数最后还有一个缺省参数. connect函数原型是这样的: QMetaObject::Connection QObject::connect(const QO ...
- linux下mysql数据库导入导出命令
首先linux 下查看mysql相关目录root@ubuntu14:~# whereis mysqlmysql: /usr/bin/mysql---- mysql的运行路径 /etc/mysql ...
- 使用Python登陆QQ邮箱发送垃圾邮件 简单实现
参考:Python爱好者 知乎文章 需要做的是: 1.邮箱开启SMTP功能 2.获取授权码 上述两步百度都有. 源码: #!/usr/bin/env python from email.mime.te ...