# draupnir **Repository Path**: twqian/draupnir ## Basic Information - **Project Name**: draupnir - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-26 - **Last Updated**: 2026-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Draupnir 一款简洁高效的局域网 P2P 文件传输工具。基于 Tauri + Vue 3 构建,支持拖拽发送、实时进度显示,无需复杂配置即可在同一网络下快速分享文件。 ## 功能特性 - **P2P 直连** — 收发双方直接建立连接,无需中转服务器 - **拖拽发送** — 将文件拖入窗口即可发起传输 - **实时进度** — 显示传输速度、剩余时间、已完成/总大小 - **多文件传输** — 支持同时传输多个文件 - **自动接收** — 对方发送文件时自动接收,保存到下载目录 - **虚拟网卡过滤** — 自动排除 VPN、虚拟机等虚拟适配器,显示真实局域网 IP ## 系统要求 - Windows 10/11 - WebView2 运行时(Tauri 自动捆绑) ## 安装 ### 预编译版本 前往 [Releases](https://gitee.com/twqian/draupnir/releases) 下载最新版的 `.exe` 安装包。 ### 从源码构建 需要先安装以下工具: - [Node.js](https://nodejs.org/) (建议 v18+) - [Rust](https://www.rust-lang.org/) (建议 v1.70+) - [Git](https://git-scm.com/) ```bash # 克隆仓库 git clone https://gitee.com/twqian/draupnir.git cd draupnir # 安装前端依赖 npm install # 开发模式运行 npm run tauri:dev # 构建生产版本 npm run tauri:build ``` 构建完成后,可执行文件位于: - Windows: `src-tauri/target/release/draupnir.exe` ## 使用方法 1. 启动应用后,界面上会显示本机局域网 IP 2. 在另一台同一网络的电脑上启动应用,也获取其 IP 3. 在"对方 IP"输入框填入对方 IP,点击连接 4. 将文件拖入窗口,或点击选择文件发送 5. 对方会自动接收文件,保存到 `下载文件夹/Draupnir/` 目录 ## 技术架构 ``` ┌─────────────────────────────────────────────────┐ │ Frontend (Vue 3) │ │ ┌──────────────┐ ┌────────────┐ ┌─────────┐ │ │ │ConnectionPanel│ │FileDropZone│ │Progress │ │ │ └──────────────┘ └────────────┘ └─────────┘ │ └──────────────────────┬──────────────────────────┘ │ Tauri IPC (invoke/events) ┌──────────────────────▼──────────────────────────┐ │ Backend (Rust) │ │ ┌──────────────┐ ┌────────────────────────┐ │ │ │ get_local_ip │ │ TCP Listener │ │ │ │ send_file │ │ (port 9527, tokio) │ │ │ └──────────────┘ └────────────────────────┘ │ └─────────────────────────────────────────────────┘ ``` ### 传输协议 1. 发送方连接到 `对方IP:9527` 2. 发送 4 字节头部长度 + JSON 头部(文件名、文件大小) 3. 接收方返回 1 字节 ACK (0x01) 4. 发送方以 1MB 为单位分块传输文件内容 5. 接收方写入 `Downloads/Draupnir/`,文件名冲突时添加时间戳后缀 ### 安全措施 - 文件名经过 `sanitize_filename()` 处理,拒绝路径分隔符和 `..` 遍历 - 文件大小上限 10GB - 头部大小上限 64KB - 自动过滤虚拟网卡(VPN、VM、WSL 等) ## 项目结构 ``` draupnir/ ├── src/ # Vue 前端源码 │ ├── components/ # Vue 组件 │ │ ├── ConnectionPanel.vue # 连接面板(显示/输入 IP) │ │ ├── FileDropZone.vue # 文件拖放区 │ │ └── TransferProgress.vue # 传输进度显示 │ ├── App.vue # 根组件 │ ├── main.ts # 前端入口 │ └── styles/ # 样式文件 ├── src-tauri/ # Rust 后端源码 │ ├── src/ │ │ ├── main.rs # Tauri 入口 │ │ ├── commands/ # Tauri 命令 │ │ │ ├── network.rs # get_local_ip │ │ │ └── transfer.rs # send_file │ │ └── server/ │ │ └── listener.rs # TCP 文件接收服务 │ ├── Cargo.toml # Rust 依赖 │ └── tauri.conf.json # Tauri 配置 ├── package.json # Node 依赖 └── CLAUDE.md # Claude Code 指南 ``` ## 命令参考 ```bash # 前端开发 npm run dev # 启动 Vite 开发服务器 (端口 1420) npm run build # 构建 Vue 前端 # Tauri 开发 npm run tauri:dev # 开发模式运行完整应用 npm run tauri:build # 构建生产版本 # 测试 npm run test # 运行 Vitest 单元测试 npm run test:watch # 监听模式运行测试 npm run test:coverage # 生成覆盖率报告 # Rust 源码目录 (src-tauri/) cargo build # 构建 Rust 后端 cargo test # 运行 Rust 测试 cargo fmt # 格式化代码 cargo clippy # 代码检查 ``` ## License MIT