Skip to content
nangongjing1Public

About

用 C++ 编写的轻量局域网文件互传工具

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Filedrop · 局域网文件传输

一个用 C++ 编写的局域网文件互传工具,编译为单个可执行文件,无第三方运行时依赖:

  • 服务端:启动后自动打开浏览器控制台,显示局域网内已连接的设备。
  • 客户端:手机 / 平板 / 其它电脑用浏览器访问 http://filedrop.ng/ 即可与服务器互传文件。
  • 服务端可以向一个或多个设备下发文件,也可以向设备请求文件;客户端只能与服务器收发文件。

功能

服务端 客户端
在线设备列表、在线/离线状态与最后在线时间 设备名称保存在服务端配置中,页面可修改并写回配置
多选设备群发文件,实时显示发送进度 拖拽或选择多文件 / 整个文件夹上传,逐文件进度
从设备接收文件、下载、转发给其它设备 接收服务端下发的文件(含大小与 SHA-256)
向指定设备「请求文件」,客户端实时提示 响应服务器请求,选择文件回传
设备重命名、传输历史、SHA-256 校验值 本次会话的收发记录
二维码扫码打开客户端、多网卡地址一览 断线自动重连、失败重试
诊断日志(记录来源 IP)、--diagnose 环境体检

目录结构

Makefile                构建脚本(Windows / Linux / macOS)
src/                    服务端实现(HTTP、SSE、DNS、存储、设备、SHA-256、防火墙)
include/                服务端头文件
src/filedrop.rc         Windows 资源脚本(应用图标)
src/filedrop.ico        由 web/favicon.svg 生成的多尺寸图标
web/                    管理端与客户端页面(构建时嵌入可执行文件)
tools/embed_web.py      把 web/ 资源生成 C++ 源文件
tools/make_icon.py      把 web/favicon.svg 生成 Windows 图标
tools/dns_test.cpp      DNS 协议单元测试
tools/http_test.cpp     HTTP 解析与工具函数单元测试

编译

Windows(MinGW-w64 + GNU make)

需要 g++ 和 make(或 mingw32-make):

make            # 生成 filedrop.exe

构建日志默认静默:只显示每一步的名称(CXX / RC / LD 等),链接结束后输出构建产物路径、大小和本次编译耗时。需要查看完整命令行时执行 make V=1。

也可以直接运行 build.cmd,它会自动在常见位置查找 w64devkit 再调用 make。

修改了 web/ 下的页面后需要重新嵌入资源(需要 Python 3):

make assets
make

修改了 web/favicon.svg(应用图标)后需要重新生成图标(需要 Python 3):

make icon
make

图标以多尺寸 .ico 形式编译进 filedrop.exe,因此资源管理器、任务栏和快捷方式都会显示该图标。

运行单元测试(不访问网络,可直接执行):

make test

构建产物是静态链接的单个 filedrop.exe,正常构建不需要 Python。 若安装了 Visual Studio 生成工具,也可在 vcvars64.bat 环境中执行 make MSVC=1。

Linux / macOS

make
./filedrop

运行

.\filedrop.exe

控制台会打印服务端控制台地址(带随机 token)、客户端地址、所有网卡地址以及 DNS / 防火墙状态,并自动打开浏览器:

============================================================
  Filedrop · 局域网文件传输
============================================================
  服务端界面    http://127.0.0.1:80/admin?t=xxxxxxxx
  客户端地址    http://filedrop.ng/
  本机地址      http://192.168.1.10/   <-- 其它设备也可直接用这个
  数据目录      filedrop-data
------------------------------------------------------------
  DNS: 已启动(UDP 53)
  防火墙: 已自动添加入站规则
------------------------------------------------------------
  检测到多块网卡,请选择与客户端同一网段的地址:
    192.168.48.1/255.255.255.0  VMware Network Adapter VMnet8
    192.168.1.10/255.255.255.0  WLAN  (当前使用)
  如选错,可用 --ip <地址> 指定。
============================================================
  [自检] http://192.168.1.10/ 本机回环访问正常。

常用参数:

参数 说明
--port <端口> HTTP 端口,默认 80;80 被占用时自动尝试 8080
--bind <地址> 监听地址,默认 0.0.0.0
--data <目录> 数据目录,默认 filedrop-data
--hostname <域名> 客户端域名,默认 filedrop.ng
--alias <域名> 额外可解析的域名,可重复;默认自动保留旧域名 filedrop.ng
--ip <地址> 多网卡时手动指定对客户端公布的 IP
--no-open 不自动打开浏览器
--no-dns 不启动内置 DNS
--dns-port <端口> DNS 端口,默认 53
--upstream <IP> 上游 DNS,默认读取系统配置
--firewall <模式> auto(默认,缺失时尝试加规则)/ check(只检查)/ off
--no-firewall 等同 --firewall off
--diagnose 只做环境体检并生成 filedrop-data/diagnose.txt,不启动服务
--keep 保留数据目录中的旧文件(默认启动时清空)

运行中可在控制台输入:s 状态、o 重新打开浏览器、h 帮助、q 退出。

让局域网设备访问客户端页面

第 1 步:扫码或输入 IP(最快,推荐先做这一步)

控制台首页有一块二维码,手机相机/微信扫一扫即可直接打开客户端页面——不依赖 DNS,也不用在手机上输入网址。二维码默认编码 IP 地址,也可以在下拉框切换到域名地址。

也可以手动访问控制台打印的 本机地址(如 http://192.168.1.10/)。

打不开时依次检查:

  1. 防火墙:程序启动时会尝试以管理员权限自动添加 Filedrop HTTP <端口>、Filedrop DNS <端口> 两条入站规则(会弹出一次 UAC 确认,同意即可)。 若拒绝或失败,请用管理员 PowerShell 手动执行控制台提示的命令,或:
    netsh advfirewall firewall add rule name="Filedrop HTTP 80" dir=in action=allow protocol=TCP localport=80
    netsh advfirewall firewall add rule name="Filedrop DNS 53" dir=in action=allow protocol=UDP localport=53
  2. 网段:确认客户端和服务端连的是同一个 Wi-Fi / 交换机,且服务端没有接 VPN。访客 Wi-Fi 通常开启了 AP 隔离,设备之间无法互访。
  3. 多网卡:虚拟机(VMware/Hyper-V)、VPN、蓝牙网卡会让「本机地址」选错。控制台会列出全部网卡,用 --ip <正确地址> 固定即可,二维码也会跟着切换。
  4. 端口 80 被占用:控制台会显示实际端口(如 8080),访问时需带上端口。

第 2 步:使用 filedrop.ng(需要设备把 DNS 指向服务端)

filedrop.ng 不会指向你的服务器,只有把设备的 DNS 改成服务端 IP(或在局域网 DHCP 里下发这个 DNS),它才会解析到本机。内置 DNS 应答器只负责这条记录,其它域名会转发给上游 DNS(启动时会先探测系统 DNS 与网关,选一个能响应的),不影响正常上网。

  • Windows:网络设置 → 当前网卡 → IPv4 属性 → 使用下面的 DNS 服务器
  • Android:WLAN → 当前网络 → 修改网络 → 高级 → IP 设置改为「静态」→ DNS 1 填服务端 IP → 保存(IP/网关/前缀保持 DHCP 给出的值)
  • iOS:WLAN → 当前网络 → 配置 DNS → 手动 → 添加服务端 IP
  • macOS:系统设置 → 网络 → 详情 → DNS → 添加服务端 IP

然后在浏览器输入 http://filedrop.ng/(建议输完整地址,带 http://;若浏览器自动补全成 https://,改回 http:// 或点击「继续访问」)。

不能改 DNS 的设备(例如个别手机):修改 hosts,加入控制台显示的那一行:

192.168.1.10 filedrop.ng

Windows hosts:C:\Windows\System32\drivers\etc\hosts;macOS/Linux:/etc/hosts。 数据目录里会自动生成 hosts-help.txt 与 clients-hosts.ps1(本机以管理员运行)。

DNS 端口 53 若被其它程序占用(例如 Internet 连接共享),程序会自动尝试只绑定本机地址;仍失败时控制台会给出提示,此时用 IP 或 hosts 方式访问即可。

使用流程

  1. 服务端启动后自动打开控制台。
  2. 客户端打开 http://filedrop.ng/,控制台「已连接设备」中出现该设备。
  3. 服务端 → 设备:把文件拖到「待发送文件」,勾选一个或多个设备,点击「发送到已选设备」;客户端实时收到提示,点「接收」保存。
  4. 设备 → 服务端:客户端拖拽文件/文件夹或点「选择文件」,上传完成后出现在「已接收文件」,可下载或转发。
  5. 服务端请求文件:在设备卡片点「请求文件」,客户端出现请求卡片,选择文件后回传。

排查:客户端打不开时先看日志

服务端会把每一次网页访问和 DNS 查询的来源 IP 写入 数据目录/filedrop.log,控制台页面底部的「诊断日志」卡片也能直接查看。

现象 说明
日志里出现 HTTP GET / 来自 192.168.x.x 请求已经到达服务端,问题在页面/浏览器一侧
只有 DNS filedrop.ng ... 来自 192.168.x.x,没有 HTTP 记录 域名解析到了,但 HTTP 被拦截(防火墙/安全软件)
日志里完全没有客户端 IP 请求根本没到本机:设备不在同一网络、路由器开了 AP 隔离,或设备根本没用这个地址

另外可以运行 filedrop.exe --diagnose:它会列出网卡、当前 Wi-Fi、端口占用、防火墙配置(含「阻止所有入站连接」这类策略)、系统 DNS 与 hosts 记录,并写入 filedrop-data/diagnose.txt。

安全与数据

  • 控制台使用启动时随机生成的 token 保护,局域网内其它设备无法调用管理接口(直接访问 /admin 返回 403)。
  • 客户端使用浏览器本地生成的设备 ID 与密钥,只能读取自己的待接收文件。
  • 下发给设备的下载链接为随机令牌,10 分钟内有效且绑定目标设备。
  • 客户端页面没有跨设备列表,也不能控制服务端。
  • 文件保存在服务端 filedrop-data/files/(启动默认清空,--keep 保留),不经过互联网。
  • 设备重命名记录保存在数据目录的 config.ini([devices] 段,设备ID=名称),重启后仍然生效;运行中直接编辑该文件也会立即生效(删除某行即恢复客户端自己的名称)。该文件不会被启动时的清理删除。
  • 明文 HTTP,仅建议在可信局域网内使用。

常见问题

设备打不开客户端页面 先在客户端访问 http://<服务端IP>/ 排除防火墙/网段问题,再排查域名;控制台和网页里都提供「打不开?查看排查步骤」。

浏览器把地址变成 https:// 或搜索词 请完整输入 http://filedrop.ng/;若弹出「HTTPS 优先」提示,选择继续使用 HTTP。若手机 DNS 没有指向服务端,域名本来就不存在,会直接报「找不到服务器」。

页面提示需要管理权限 请用启动时打印的带 ?t= 的地址打开控制台;直接访问 /admin 需要有效 Cookie。

客户端收不到文件 确认设备在线(绿色状态点),下载链接在 10 分钟内有效;离线设备重新连接后需在有效期内接收。

大文件传输中断 传输全程流式处理,不占大内存;请保持页面打开、避免切换网络,中断后重新发送即可。

filedrop.exe 被 Windows 拦截(应用控制策略已阻止此文件) 程序没有数字签名,Windows 11 的 Smart App Control(应用控制策略)会拦截未签名程序,与代码无关。可选:在「Windows 安全中心 → 应用和浏览器控制 → Smart App Control」关闭(关闭后需重置系统才能重开);换用未启用该功能的电脑;或使用受信任证书为 exe 签名。

杀毒软件报警 程序会监听局域网端口并提供网页,部分安全软件会对未签名的网络服务报警,请按需加入信任列表。

说明

  • 服务端只监听局域网,不主动连接外网(仅转发 DNS 查询)。
  • 单文件大小仅受磁盘空间限制。
  • 传输记录保存在内存中,进程退出即清空。

About

用 C++ 编写的轻量局域网文件互传工具

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages