本项目开发基于 Red Hat Enterprise Linux(RHEL) 6.3 平台 ,通过本项目大家会深入理解下述内容:
- Socket 网络编程技术
- 基于TCP/IP 协议的网络编程技术
- 基于 TCP 的高并发 C/S 设计
- IO 复用技术
- MySQL API 编程技术
- Shell 脚本编程技术
本项目使用 C 语言作为主要开发语言,Shell作为辅助开发语言,如果你想深入学习 Linux C 网络编程技术,那就快来加入吧!!!
-
-
- 0. 写在前面
- 1. 系统设计目标
- 2. 系统整体设计思路
- 2.1 网络传输协议的选择与通信协议的设计
- 2.2 数据库设计
- 3. 上传、下载文件的设计方案
- 4. 断点续传的原理及设计
- 5. 秒传的原理及设计
- 6. 数据库设计 API 编程与 shell 脚本的结合
- 7. 大文件的传输
- 8. sendfile() “零拷贝”技术
- 9. 实现高并发——负载均衡技术
- 10. 系统演示
- GitHub 源码地址
- 后记
-
这是我的第一篇 Chat 分享,之前都是在 我的CSDN博客:ZYZMZM 上更新 C/C++/Linux 等基础知识和一些底层实现原理之类的博文,想尝试一种新的方式,并且自己开发本项目也比较用心,本项目由我一个人独立开发,真诚地想和大家分享一下自己的感悟、项目的整题设计流程和遇到的各种坑,没有想到发布两天时间就有 120 多位朋友的预定,在这里再次感谢大家的支持。
完成本项目的预备知识我在文件的后记部分给大家分享了我 CSDN 博文的链接。
本场 Chat 主要围绕下述内容展开介绍:
文章最后给出项目的 GitHub 源码地址,供大家分享。
1. 系统设计目标系统基于 TCP 协议提供局域网 LAN 内文件传输(含大文件传输)服务,首先要有基本的命令交互功能,比如客户端要查看服务端文件信息、root 管理员用户可以删除服务端文件信息等基本命令交互,核心是实现文件的上传和下载功能。
这些功能本身是非常容易实现的,是基本的 TCP 协议通信传输过程。再从功能上进行丰富,需要实现文件传输过程中的断点续传功能、秒传功能。进一步丰富功能,应该实现简单的用户管理功能:新用户可以通过注册进入系统,已注册的用户可以直接登录进入系统,而且系统中应该有一个管理员用户拥有更高级别的权限,比如删除服务端文件、关闭服务器等。
因为添加了用户管理模块,因此需要在文件的上传和下载部分做一些改变进行正确的控制,之后会详述。
更为重要的是需要实现多客户对服务器的并发访问,在这里我们简单地使用多线程来实现。因为服务器提供局域网 LAN 内文件传输,因此多线程实现是基本满足要求的。那么在大型复杂的环境中,我们应该使用分布式集群技术,可以采用负载均衡技术实现分布式集群的高并发问题,我们在文章最后会讨论其原理。
2. 系统整体设计思路 2.1 网络传输协议的选择与通信协议的设计那么首先,先忽视一些细枝末节,我们分析系统应该如何实现文件上传和下载主要功能。
由于是进行文件传输,因此我们需要使用面向连接的、可靠的 TCP 协议来作为系统的网络传输协议。我们使用 Socket 编程,虽然难度较高,但对于理解协议的执行过程是很有效的学习方式,使用两个重要的接口 send() 和 recv() 函数来实现数据的收发功能。我们也自定义通信协议进行客户端与服务器的通信过程,例如,下载文件时,客户端向服务器发送“begin”,服务器收到后便开始向客户端传输文件,服务器传输完毕后向客户端发送“##close##”,客户端收到后便停止数据接收,文件传输完毕。
那么在这里我们需要考虑一个问题,当服务器与客户端进行文件传输的时候,文件未传输完毕,客户端因为各种原因退出了,那么服务器便会崩溃,导致了不稳定性的产生。根本原因是服务器会接收到一个 SIGPIPE 信号,我们可以使用三种方式来解决。
- 在服务器端忽略 SIGPIPE 信号
- 使用 send() 函数的 MSG_NOSIGNAL 标志位
- 使用 poll() 函数监测 POLLRDHUP 事件,捕获连接异常
本系统为了服务器的高可用和稳定性,使用了第三种方式来解决客端异常断开连接的情况。我们在后面会进行讲解具体实现。
上面解决了系统的基本问题:上传和下载。接下来我们谈一下系统的用户管理设计、文件管理设计。
我们采用 MySQL 作为服务器的后台数据库,建立了三个数据库:
loginUser
用户信息数据库。数据表为 user,主要存储用户名和密码,用于登录验证的匹配。
md5
文件信息数据库。数据表为 md5table,主要存储文件的主要信息:文件名、文件 MD5 值、文件属主、文件完整标志位。
serverLog
服务器启动信息数据库。数据表为 serverStartInfo,主要记录服务器启动次数、启动时间。