# S1mpleNetDisk **Repository Path**: hu-linghua/s1mple-net-disk ## Basic Information - **Project Name**: S1mpleNetDisk - **Description**: 一个简单的网盘项目 - **Primary Language**: C - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-05-31 - **Last Updated**: 2024-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # S1mpleNetDisk ## 介绍 一个Linux平台下使用C语言实现的简单网盘项目🥳🥳🥳 ## 使用说明 ### 服务端使用 - 在 `config/server_config.json` 中修改ip和端口配置 - 确保你的 `server` 文件夹下有以下目录 - `config` 配置文件 - `include` 头文件 - `lib` 第三方静态库文件 - `log` 服务器日志 - `obj` 编译过程生成的目标文件 - `src` 源文件 - `storage` 服务器存储文件的真实目录 - 服务端可使用 **shutdown** 指令有序退出 ### 客户端使用 - 确保你的 `client` 文件夹下有以下目录 - `include` 头文件 - `obj` 编译过程生成的目标文件 - `src` 源文件 - `storage` 客户端用于存储下载文件的目录 - 可用指令列表如下: - **quit** - **ls** - **cd** - **pwd** - **remove** - **mv** - **mkdir** - **download** - **upload** ### Doxygen文档生成 - 使用了自定义主题 **doxygen-awesome-css** 🥰 https://github.com/jothepro/doxygen-awesome-css - 生成引用关系图、函数调用关系图等需要额外安装 **graphviz** ```shell sudo apt-get install doxygen graphviz ``` - 分别生成Client和Server的文档 ```shell doxygen Doxyfile.client doxygen Doxyfile.client ``` - 生成的文档在项目根目录下的`docs`目录中 ## 项目模块划分 ### 服务端模块 - [x] 网络通信 - [x] 建立TCP/IP连接 - [x] 单文件传输 - [ ] 文件断点续传 - [x] 文件秒传 - [ ] 断线重连 - [ ] 文件夹下载:递归添加?打包? - [x] 时间轮盘超时踢出 - [ ] 多点下载 - [x] 线程池管理 - [x] 线程池的创建、销毁 - [x] 提交任务 - [ ] 动态扩容策略? - [x] 任务队列 - [x] 任务结构体存储函数指针和参数 - [ ] 阻塞队列? - [x] 文件管理 - [x] ~~按用户分配不同的存储路径~~ - [x] 限制用户访问权限 - [x] 数据库 - [x] 虚拟文件森林表 - [x] 用户信息表 - [x] 多线程连接数据库 - [ ] 数据库连接池 - [x] 用户管理 - [x] 用户登录注册验证 - [x] 密码hash+盐值加密验证 - [ ] JSON Web Token - [x] 日志记录 - [x] 日志接口函数定义 - [x] 使用线程锁保证线程安全问题 - [x] 日志文件切割与归档 - [ ] 异步日志记录 - [ ] ... ### 客户端模块 - [x] 命令解析 - [ ] help辅助命令 - [x] 判断命令合法性 - [x] 登陆注册验证 - [ ] 终端界面 - [ ] 文件下载进度条(参考apt install) - [x] 可以下载文件的同时输入新的指令? - [x] 网络通信 - [x] 与服务端建立TCP连接 - [x] 建立隧道连接 - [x] 文件上传、下载 - [ ] 断点续传 - [x] 文件秒传 - [ ] 多点下载 - [x] 文件管理 - [x] 设置下载路径? - [ ] 客户端多线程 - [ ] 长短指令分离 ## 项目代码规范 ### 变量命名 - 只使用常见约定俗成的缩写 ```c Queue_t queue_ptr; char buf[1024]; ``` - 变量命名是一般使用**下划线**分隔,包括结构体成员 ```c int net_fd ``` - **描述性信息在前**,变量类型或表示形式在后 ``` c int socket_fd; int epoll_fd; ``` - 结构体类型名使用大驼峰命名 ```c typedef struct pool_s {...} Pool_t; ``` - 类型别名全部使用`_t`结尾 ```c typedef struct thread_pool_s {...} ThreadPool_t; ``` - 必须做重要函数返回值错误判断,且根据具体情况单独做处理,选择返回错误标记还是直接退出,一般不使用ERROR_CHECK宏 ```c ThreadPool_t *pool = (ThreadPool_t *)calloc(1, sizeof(ThreadPool_t)); if (pool == NULL) { return NULL; } ``` - **做错误判断时**接收函数返回值的变量统一使用`ret_`跟函数名或函数名缩写 ```c int ret_send = send(client_socket, buffer, strlen(buffer), 0); ``` - 结构体使用**Doxygen语法**在头文件中注释,结构体用途和成员定义 ```c /** * @brief 服务器配置信息结构体 * 这个结构体用于存储服务器的配置信息,包括端口号、最大连接数和存储路径。 */ typedef struct { int port; /**< 服务器监听的端口号 */ int max_connections; /**< 服务器允许的最大连接数 */ char storage_path[MAX_PATH_LENGTH]; /**< 服务器文件存储路径 */ } ServerConfig; ``` ### 函数命名 - 自定义函数全部使用小驼峰法命名,一般动词开头,后跟多个名词 ```c int sendFile(int net_fd); int initTcpSocket(int * socket_fd, char *ip, char *port); ``` - 使用Doxygen语法在函数对应头文件中注释,表明参数用途、返回值等 ```c /** * @brief 从配置文件中加载服务器配置信息 * 从指定路径的配置文件中读取服务器的配置信息,并将其加载到指定的服务器配置结构体中。 * @param file_path 配置文件的路径 * @param config 指向服务器配置结构体的指针,用于存储加载的配置信息 * @return */ void loadServerConfig(const char *file_path, ServerConfig_t *config); ``` ### 文件命名 - 全部使用小写字母和下划线 ``` server.c tcp_init.c thread_pool.c ``` ### 头文件与源文件 - 头文件保护语法全部使用 `#ifndef`,后跟全大写、用下划线分隔的头文件名 ```c #ifndef __LOAD_CONFIG_H #define __LOAD_CONFIG_H ... #endif /* __LOAD_CONFIG_H */ ``` - 源文件内的头文件包含顺序应满足下面的顺序,以确保本模块对应头文件缺失必要头文件时会报错 ```c #include "本模块直接相关的头文件" #include "C库头文件" #include "C++库头文件" #include "其他第三方库头文件" #include "其他项目自定义头文件" ``` - 头文件中仅包含必要的声明和定义,当对应源文件需要引用新的头文件时一般应该在源文件中添加引用 - 头文件应该尽可能自完备,可以独立编译,避免使用前置声明,必要时引用其他头文件 ### 其他 - IDE中修改输入制表符时转化为`4`个空格 - 书写函数具体代码时尽可能按照分块逻辑使用空行隔开 - 未定......