# ftp_server **Repository Path**: gitee00000/ftp_server ## Basic Information - **Project Name**: ftp_server - **Description**: ftp____________________ - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-19 - **Last Updated**: 2026-05-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ftp_http_fs_system 生产级 FTP + HTTP 文件服务器(Linux,C11,零第三方依赖)。 ## 现状(Phase 2) **已支持**:HTTP/1.1(GET / HEAD / PUT / DELETE / OPTIONS)、keep-alive、 单段 Range、If-None-Match/If-Modified-Since → 304、`sendfile` 零拷贝下行、 PUT 流式写入临时文件 + `rename` 原子替换、Expect: 100-continue。 尚未实现(后续 Phase): - P3 authn(users.passwd + PBKDF2-SHA256) / 限流 / chunked 请求体 / 目录列表 - P4 FTP(仅 PASV;REST/APPE 断点续传;UTF-8) - P5 Prometheus 导出 / 结构化日志 / 压测脚本 ## 构建 ```bash mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. cmake --build . -j ``` 可选: - `-DFS_BUILD_TESTS=ON` 若 `tests/` 存在则构建测试 - `-DFS_SANITIZE=asan|ubsan|tsan` 构建含 sanitizer 的版本 或直接:`./build.sh` ## 快速体验 ```bash mkdir -p /tmp/fileserver echo 'hello fsd' > /tmp/fileserver/index.html ./build/fsd -c config/fileserver.conf # 默认 http_port=8080, echo_port=9000 curl -i http://127.0.0.1:8080/index.html curl -i -H 'Range: bytes=0-4' http://127.0.0.1:8080/index.html curl -i -X PUT --data-binary @somefile http://127.0.0.1:8080/upload.bin curl -i -X DELETE http://127.0.0.1:8080/upload.bin ``` P1 冒烟(echo): ```bash printf 'hello\r\nQUIT\r\n' | nc 127.0.0.1 9000 ``` ## 目录 ``` include/fs/{base,util,net,proto,app}/*.h 公共接口 src/{base,util,net,proto,app}/*.c 实现 src/proto/http/ HTTP 协议栈 src/main.c 入口 config/ 默认配置 cmake/ 构建模块 ``` ## 设计要点 - **Multi-Reactor**:每 worker 独占 epoll 与 listen fd(`SO_REUSEPORT`),内核做 accept 负载均衡。worker 之间零共享、零锁。 - **协议策略**:`fs_protocol_t` 通过 `on_accept/read/write/timeout/close` 注入,net 层不感知应用语义。 - **无全局状态**:所有依赖通过 `fs_ctx_t` 注入,便于测试与多实例。 - **Arena 内存**:worker 级 arena 承载会话元数据与缓冲头;IO chunk 显式 malloc/free 以便快速归还。 - **ET 读写**:读写循环到 `EAGAIN` 为止,sendfile 零拷贝推送大文件。 - **超时**:哈希时间轮,O(1) add/cancel,1 秒扫描空闲连接。 ## 许可 内部工程;不附带许可文件。