github地址:https://github.com/Worthy-Wang/NetDisk

FTP文件服务器设计思路:

1.整体架构采用线程池结合epoll监听

客户端通过sockfd与服务器通信,服务器通过sockfd进行连接新的客户端,用accept到的newfd与客户端进行通信;

主线程负责向子线程分配任务,子线程负责处理任务并于客户端通信;

简单命令主线程直接执行,puts 和 gets 命令交给子线程执行。

2.文件系统采用虚拟文件目录设计,将所有的文件存放在一个公共目录中,自己只能看到自己的文件,并创建好一个存放文件信息的数据库(此处数据库采用MYSQL)

FileId | Dir | FileName | FileSize |FileType | MD5 |User |

FileId : 文件ID, 主键, 自增型

Dir : 所在目录,0则表示根目录

FileName : 文件名称,可以相同,区分靠FileId

FileSize : 文件大小(B显示)

FileType : f 代表文件类型,d代表文件夹类型

MD5 : 文件的MD5值,用来判断文件的内容是否相同

User :文件的所属对象

命令实现:

1.cd 进入对应目录

2.ls 列出相应目录文件

3.puts 将本地文件上传至服务器

4.gets 文件名 下载服务器文件到本地

5.mkdir 增加文件夹

6.rm 删除服务器上文件

7.quit 退出

8.其他命令不响应

功能实现:

1.用户登陆与密码验证

类似/etc/shadow文件下的盐值加密,使用crypt函数进行加密,将用户账号,密码以及加密后的数据存放在数据库中;

盐值salt(随机生成)的8个字符,密码匹配方式是服务器根据客户端的用户名找到其Salt,并将Salt发送回客户端,客户端进行crypt加密后再发送给服务器进行匹配,其中需要注意客户端是没有权限访问数据库的

User | Password | Salt | Cipher

2.记录日志信息:包括客户端的请求信息,客户端连接时间,客户端的操作记录以及操作时间,并将信息都存放在数据库中;

User | Operation | time

3.文件的断点续传:客户端gets过程中如果断开,再次gets时,从断点开始传输

具体实现:客户端如果有要接收的文件file并已经下载了1000字节,则向服务器发送 gets file 1000, 服务器直接从偏移1000字节的位置开始传送,客户端也偏移1000字节开始接收

4.使用token令牌

token的介绍:https://www.jianshu.com/p/24825a2683e6

5.连接上的客户端如果30s没有相应,那么关闭描述符

https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959957&idx=1&sn=a82bb7e8203b20b2a0cb5fc95b7936a5&chksm=bd2d07498a5a8e5f9f8e7b5aeaa5bd8585a0ee4bf470956e7fd0a2b36d132eb46553265f4eaf&mpshare=1&scene=23&srcid=0718Qlp4AVKnZq1E1f144pE6#rd

此处采用轮询扫描法,设置Map//

设置一个timer,每秒都轮询Map中的元素,并将时间差大于30s的客户端连接断开

6.多点下载(选做)

数据库创建(只需进入数据库执行一次即可):

##########################################

创建数据库 Netdisk

##########################################

CREATE DATABASE Netdisk;

use Netdisk

##########################################

创建表 Virtual_Dir

##########################################

CREATE TABLE Virtual_Dir

(

FileId int NOT NULL AUTO_INCREMENT,

Dir int NOT NULL,

FileName varchar(10) NOT NULL,

FileSize BIGINT NULL,

FileType char(1) NOT NULL,

MD5 varchar(50) NULL,

User varchar(10) NOT NULL,

PRIMARY KEY(FileId)

) ENGINE=InnoDB;

INSERT INTO Virtual_Dir(Dir, FileName, FileSize, FileType, MD5, User)

VALUES(0, ‘file5’, 512, ‘f’, ‘md5’, ‘wwx’);

##########################################

创建表 Shadow

##########################################

CREATE TABLE Shadow

(

User varchar(10) NOT NULL,

Password varchar(18) NOT NULL,

Salt char(8) NOT NULL,

Cipher text NOT NULL,

PRIMARY KEY(User)

) ENGINE=InnoDB;

INSERT INTO Shadow

VALUES(‘wwx’, ‘123’, ‘xxxxxxxx’, ‘xxx…xxx’);

##########################################

创建表 Log

##########################################

CREATE TABLE Log

(

Id int NOT NULL AUTO_INCREMENT,

User varchar(100) NOT NULL,

Operation varchar(100) NOT NULL,

time varchar(100) NOT NULL,

PRIMARY KEY(Id)

) ENGINE=InnoDB;

INSERT INTO Log (User, Operation, time)

VALUES();

c 找文件服务器文件,Linux C/C++项目:虚拟文件服务器(功能匹配百度网盘)相关推荐

  1. 利用浏览器调试功能 计算 百度网盘 文件数量 V2

    最近需要统计百度网盘里文件的数量,百度网盘又没有提供这样的功能,因此之前自己写了段脚本进行查验,见<利用浏览器调试功能 计算 百度网盘>.之后发现每个目录最多文件数只有1000,因此研究了 ...

  2. 利用浏览器调试功能 计算 百度网盘 文件数量

    "百度网盘"程序做的比较烂,以百度的技术实力按说不应该如此.真正试了就知道真的不怎么样. 为了统计百度网盘的文件写了以下脚本,仅供参考: var root = "&quo ...

  3. linux上原生程序运行QQ,微信,百度网盘,王者荣耀,cf

    在 Linux 上运行王者荣耀游戏的截图: 运行微信的截图: 与现有的各种Android模拟器不同,xDroid没有使用虚拟机,而是使Android应用以Linux原生程序的形式运行,性能媲美标准的L ...

  4. 效率工具 001| 手把手教你满速下载百度网盘文件

    内容目录 PanDownload网页版 PanDownload电脑版 PanDownload 手机版 BaiduPCS-Go BaiduPCS-Web 速盘 最后想说的话 百度网盘,曾用名百度云(Ba ...

  5. 效率工具 001 | 手把手教你满速(不限速)下载百度网盘文件

    百度网盘,曾用名百度云(Baidu Cloud),是百度推出的一项个人云存储服务,覆盖中国大陆各大主流计算机和手机操作系统,包含Web版.Windows版.Mac版.Android版和iPhone版. ...

  6. 百度文件下载慢怎么办?~教你百度网盘无需VIP离线下载大文件

    百度文件下载慢怎么办?-教你百度网盘无需VIP离线下载大文件 众所周知,百度网盘的文件已经对非会员进行了各种限速.不过由于国内其他网盘基本都残废了,百度网盘作为仅存的少数几个,需求还是很大的,经常会碰 ...

  7. 百度网盘Linux版本能用吗,百度网盘Linux版使用体验效果

    以下是百度网盘Linux版使用体验效果分享,它可以在LinuxMint 19.1操作系统中运行. 前言 百度推出了重量级Linux软件,即百度网盘Linux版,这是一款百度推出的官方Linux客户端, ...

  8. 7z解压crc错误_百度网盘压缩下载文件的CRC校验错误的解决方法

    转载自:http://blog.sina.com.cn/s/blog_610787990102xcnv.html 百度网盘压缩下载文件的CRC校验错误的解决方法 从百度网盘用打包压缩方式下载的文件在解 ...

  9. 在Linux环境下通过百度网盘下载并安装matlab2017a

    前言 百度网盘下载matlab2017a安装包 方式1:安装百度网盘的python程序bypy 方式2:直接在浏览器下载 安装matlab 备注 参考链接 前言 最近参加一个比赛,需要在官方公布的li ...

最新文章

  1. J2EE经典面试题及答案
  2. 【DVWA(五)】XXS存储型跨站攻击
  3. 大数据常用数据库汇总
  4. python列表动态添加_在Python中动态创建列表
  5. (43)VHDL实现译码器与解码器
  6. 智能一代云平台(四十二):关于异常的一些事
  7. 数据结构和算法详解(四)——五大基本算法思想
  8. SpringMVC国际化(i18n)(五)
  9. 条码打印软件制作UDI标签教程
  10. 微机计算机继电保护原理,微机继电保护的发展历史
  11. win7 计算机游戏不见了怎么办,小编教你解决Win7系统下找不到自带小游戏的问题...
  12. 【数据分析】2种常见的反爬虫策略,信息验证和动态反爬虫
  13. 计算机课前导学结题报告,《导学──自悟》课题研究的结题报告
  14. Unity日志输出储存工具
  15. C51单片机实现呼吸灯
  16. win10系统激活 快捷方式
  17. 鱼雷导引仿真matlab
  18. 下载MySQL历史版本
  19. 数仓拉链表使用_如何用拉链炸弹捍卫您的网站
  20. 学历:敲门砖还是枷锁?

热门文章

  1. PyCharm 使用技巧
  2. 用户自定义协议client/server代码示例
  3. GPU上创建目标检测Pipeline管道
  4. [JAVAEE] Thymeleaf 基本语法: form相关标签
  5. Java this 关键字使用
  6. 025批量删除mac文件名中的空格
  7. 洛谷P4053 [JSOI2007]建筑抢修
  8. 20190226-利用序列化完成小型记账程序
  9. group by 分组后 返回的是一个同属性的集合
  10. CentOS6.9 ARM虚拟机扩容系统磁盘