一个用 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 解析与工具函数单元测试
需要 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。
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 退出。
控制台首页有一块二维码,手机相机/微信扫一扫即可直接打开客户端页面——不依赖 DNS,也不用在手机上输入网址。二维码默认编码 IP 地址,也可以在下拉框切换到域名地址。
也可以手动访问控制台打印的 本机地址(如 http://192.168.1.10/)。
打不开时依次检查:
- 防火墙:程序启动时会尝试以管理员权限自动添加
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
- 网段:确认客户端和服务端连的是同一个 Wi-Fi / 交换机,且服务端没有接 VPN。访客 Wi-Fi 通常开启了 AP 隔离,设备之间无法互访。
- 多网卡:虚拟机(VMware/Hyper-V)、VPN、蓝牙网卡会让「本机地址」选错。控制台会列出全部网卡,用
--ip <正确地址>固定即可,二维码也会跟着切换。 - 端口 80 被占用:控制台会显示实际端口(如 8080),访问时需带上端口。
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 方式访问即可。
- 服务端启动后自动打开控制台。
- 客户端打开
http://filedrop.ng/,控制台「已连接设备」中出现该设备。 - 服务端 → 设备:把文件拖到「待发送文件」,勾选一个或多个设备,点击「发送到已选设备」;客户端实时收到提示,点「接收」保存。
- 设备 → 服务端:客户端拖拽文件/文件夹或点「选择文件」,上传完成后出现在「已接收文件」,可下载或转发。
- 服务端请求文件:在设备卡片点「请求文件」,客户端出现请求卡片,选择文件后回传。
服务端会把每一次网页访问和 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 查询)。
- 单文件大小仅受磁盘空间限制。
- 传输记录保存在内存中,进程退出即清空。