Skip to content

v0.4.2

Choose a tag to compare

@corvofiox corvofiox released this 22 Oct 19:40
· 13 commits to main since this release

Com Bridge v0.4.2

剪贴板从"只能搬文字"扩展到文字 / 图片 / 文件,并把传输方式按 Deskflow 的成熟做法重做。

新增:跨机复制图片

截图(Win+Shift+S)、画图板、看图软件里的图,在一台机器上复制,到另一台直接
Ctrl+V 就能用。

图片按 Deskflow 的规范传裸 DIB(BMP 去掉 14 字节文件头,BI_RGB),写进对端
剪贴板时直接 SetClipboardData(CF_DIB) —— 与 Deskflow 的 MSWindowsClipboardBitmapConverter
完全一致。这样粘贴到 Word / 微信 / 画图都能识别,不需要中间转码。

(旧版其实也尝试过同步图片,但把图塞进 8MB 的 UDP 通道:1080p 截图 8.3MB 就传不动,
4K 截图 33MB 更是必然失败。见下面的传输改动。)

新增:跨机复制文件与文件夹

在资源管理器里复制文件(或整个文件夹),到另一台机器 Ctrl+V 就能落盘:

  • 文件夹会连目录结构一起还原(相对路径保留)
  • 单次上限 2GB,接收目录是 %LOCALAPPDATA%\ComBridge\received\<时间戳>\,
    只保留最近 30 批(避免磁盘无限增长)
  • 粘到哪里由你决定:程序只是把文件放进一个目录并把路径写进剪贴板,
    不会执行任何东西

传输改造:从 UDP 换成 TCP(对齐 Deskflow)

原来剪贴板走 UDP,1000 字节一块、逐字节位图重组、上限 8MB。那是给小文本设计的,
图片和文件在这条路上必然丢包。

读了 Deskflow 的 StreamChunker.cpp 之后按它的做法重做:

方面 Deskflow 本版
传输 TCP 客户端流 单独一条 TCP 通道(端口 24803)
分块 g_chunkSize = 512KB,start/data/end 三标记 同
序列化 u32 格式数 + (u32 id + u32 长度 + 数据) 同,格式 id 同值(Text=0/HTML=1/Bitmap=2)
防回环 注册 "Deskflow Ownership" 剪贴板格式 注册 "Com Bridge Ownership"

顺带说明:Deskflow 的拖放文件传输其实已经废弃(ProtocolTypes.h 里
kMsgDFileTransfer / kMsgDDragInfo 都标着 "no longer implemented"),所以文件
这部分只沿用它的消息语义(先发清单、再按文件逐个发内容),传输本身走同一条 TCP 通道。

安全边界(接收侧强制,不信对端)

  • 路径消毒:拒绝 ..、绝对路径、盘符、Windows 保留名(CON/PRN…)、超深路径;
  • 总量上限:剪贴板内容 96MB、文件 2GB、文件数 4000;
  • 落盘位置固定在 received\<时间戳>\,不覆盖你已有的文件;
  • 只写文件 + 设剪贴板,不执行。

升级注意

两台机器都要换成本版 —— 剪贴板的传输方式变了(UDP → TCP),新旧版本混用时
剪贴板不会工作(日志里会有连接被拒/无确认的提示),键鼠和音频不受影响。

全部测试

744 项通过。新增 51 项覆盖:序列化往返、未知格式跳过、路径消毒(含敌意 ..)、
目录展开与重名改名、端到端(文字 / 4MB 级 DIB / 带子目录的文件组)、上限拒收、
发送队列保序。