飞鸽传书IPMSG源码解析:UDP局域网通信实战指南
简介本资源为飞鸽传书IPMessenger2.06版完整开源源码包面向网络通信开发者、C初学者及局域网即时通讯技术研究者用于学习跨平台P2P消息传输、UDP广播发现与TCP文件传输协同机制等核心实现。压缩包共58个文件含19个CPP源文件如IPMSG.CPP、BLOWFISH.CPP、SENDDLG.CPP等覆盖主窗口、加解密、发送/接收对话框逻辑、7个H头文件定义协议结构与全局常量、4个RC资源脚本及图标ICO/GIF、1个Visual Studio 2005解决方案.sln与项目文件.vcproj完整呈现Windows平台下轻量级IM的工程组织与模块划分。资源大小仅211KB结构精炼便于逐模块阅读与调试。目前已有1239人学习下载读者可直接编译运行深入理解RSA/Blowfish混合加密、文件夹递归传输链表管理、用户在线状态广播同步等关键技术细节并基于此进行功能扩展或安全加固实践。1. 飞鸽传书IPMessenger源码局域网即时通信的“黑匣子”拆解实录你有没有在某次内网巡检时突然发现一台老工控机正安静地跑着一个叫ipmsg.exe的进程界面灰扑扑、没托盘图标、连帮助菜单都藏在右键里——但它就是能秒发消息、不依赖服务器、不走互联网、甚至在交换机断 DHCP 后还能靠 ARP 广播续命。这不是玄学是飞鸽传书IPMessenger / IPMSG——一个 2000 年代初诞生、至今仍在产线/实验室静默服役的纯 UDP 局域网信使。它的源码不是 GitHub 上的玩具项目而是一份被真实场景反复锤炼过的 C/C 实战范本无外部依赖、零配置自发现、消息可靠投递靠重传ACK、文件传输用分块校验断点续传。本文不讲“它多经典”只做一件事把这份沉在 SourceForge 旧仓库里的.tar.gz源码包真正拆开、编译通、跑起来、改得动。适合需要定制内网通知模块的嵌入式工程师、想吃透 UDP 可靠化机制的网络新手、或是正在给老旧工业系统补通信能力的现场支持人员——别再靠截图传指令了这次你直接改协议栈。2. 源码结构与编译链路从 tar 包到可执行二进制的硬核还原飞鸽传书源码不是现代 CMake 工程它扎根于 MinGW NASM 手写 Makefile 的原始生态。官方发布包如ipmsg-1.4.3.tar.gz解压后目录极简src/下全是.c和.hres/放资源脚本doc/是日文注释的协议说明。没有CMakeLists.txt没有configure脚本只有Makefile.win32和Makefile.linux两个手工维护的构建入口。这意味着你不能cmake .. make必须亲手喂对编译器、路径、链接库。下面以 Windows 平台MinGW-w64为例还原一条可复现的编译路径。2.1 环境准备MinGW-w64 的精准版本锚定飞鸽传书源码中大量使用__declspec(dllimport)和#pragma comment(lib, ...)这是 MSVC 风格但作者用 MinGW 兼容层绕过。实测发现GCC 11 会因_WIN32_WINNT宏定义冲突导致ws2_32.h编译失败。血泪经验是锁定 MinGW-w64 8.1.0x86_64-posix-seh该版本头文件与源码中的winver.h补丁完全匹配。安装后验证关键路径# 确保以下路径存在且可读 ls /mingw64/x86_64-w64-mingw32/include/{winsock2.h,ws2tcpip.h} ls /mingw64/x86_64-w64-mingw32/lib/{libws2_32.a,libgdi32.a}提示不要用 MSYS2 的pacman -S mingw-w64-x86_64-toolchain全装它默认拉 GCC 13请单独下载 MinGW-w64 8.1.0 离线包解压后手动添加/mingw64/bin到PATH。2.2 修改 Makefile.win32三处必改参数原Makefile.win32假设编译器路径为/mingw/bin/gcc需适配新路径更关键的是其-mwindows链接选项会隐藏控制台导致调试时看不到printf日志。我们先改出调试版# 文件Makefile.win32第 15 行起修改 CC x86_64-w64-mingw32-gcc WINDRES x86_64-w64-mingw32-windres RM rm -f # 关键修改1去掉 -mwindows强制显示控制台便于调试 CFLAGS -O2 -Wall -D_WIN32_WINNT0x0501 -I./src -I/mingw64/x86_64-w64-mingw32/include LDFLAGS -s -L/mingw64/x86_64-w64-mingw32/lib # 关键修改2显式链接 ws2_32原 Makefile 隐式依赖新版 MinGW 必须明写 LIBS -lws2_32 -lgdi32 -lcomctl32 -lshell32 # 关键修改3资源编译路径修正原路径指向 ./res/ipmsg.rc RCFILE ./res/ipmsg.rc2.3 编译命令链分步执行不可跳过进入src/目录后严格按顺序执行任何一步失败都停# 步骤1预处理检查确认宏定义无冲突 x86_64-w64-mingw32-gcc -E -dD ipmsg.c | grep -i winnt\|socket # 步骤2编译所有 .c 为 .o注意 -c 参数 x86_64-w64-mingw32-gcc $(CFLAGS) -c ipmsg.c -o ipmsg.o x86_64-w64-mingw32-gcc $(CFLAGS) -c main.c -o main.o x86_64-w64-mingw32-gcc $(CFLAGS) -c msgbox.c -o msgbox.o # ... 依次编译 src/ 下全部 .c 文件共 12 个 # 步骤3编译资源脚本生成 ipmsg.res x86_64-w64-mingw32-windres $(RCFILE) -O coff -o ipmsg.res # 步骤4最终链接顺序不能错.o .res -lxxx x86_64-w64-mingw32-gcc $(LDFLAGS) ipmsg.o main.o msgbox.o ... ipmsg.res $(LIBS) -o ipmsg.exe逻辑说明$(CFLAGS)中-D_WIN32_WINNT0x0501强制指定 Windows XP SP1 API 级别这是源码兼容的最低阈值$(LIBS)顺序至关重要-lws2_32必须在-lgdi32前否则WSAStartup符号未解析windres生成的.res必须最后链接否则图标/版本信息丢失。编译成功后ipmsg.exe大小约 320KB无任何 DLL 依赖用ldd ipmsg.exe验证为not a dynamic executable。此时双击运行你会看到熟悉的蓝底白字主窗口——但注意它默认监听127.0.0.1必须手动改配置才能发现局域网其他机器。3. 协议逆向与核心模块解析UDP 自发现与消息可靠化的底层实现飞鸽传书不用中心服务器全靠 UDP 广播组播单播三级穿透。它的“零配置”不是魔法而是对IPPROTO_IP、IP_MULTICAST_TTL、SO_BROADCAST等 socket 选项的极致调用。源码中最值得深挖的是net.c和msg.c——这里藏着一套轻量级但鲁棒的“UDP 可靠化”协议。3.1 自发现机制三次广播的时序与载荷设计当ipmsg.exe启动它立即向255.255.255.255:2425发送三条不同目的的 UDP 广播包见net.c:send_broadcast()广播类型目的端口载荷特征触发动作Hello2425PRG:IPMSG 本机 NetBIOS 名对方回复OK并缓存本机 IPUpdate2425PRG:IPMSG 时间戳刷新对方缓存的本机在线状态Bye2425PRG:IPMSGBYE通知下线非强制依赖心跳关键代码在net.c第 421 行// 发送 Hello 广播的核心逻辑 int send_hello_broadcast() { struct sockaddr_in addr; int sock socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); int broadcast_enable 1; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, broadcast_enable, sizeof(broadcast_enable)); // 必须开启广播 memset(addr, 0, sizeof(addr)); addr.sin_family AF_INET; addr.sin_port htons(2425); addr.sin_addr.s_addr INADDR_BROADCAST; // 255.255.255.255 char buf[256]; snprintf(buf, sizeof(buf), PRG:IPMSG:%s:%d:%s, get_netbios_name(), getpid(), HELLO); // 载荷格式固定 return sendto(sock, buf, strlen(buf), 0, (struct sockaddr*)addr, sizeof(addr)); }参数说明SO_BROADCAST是开关不设则sendto返回EACCESINADDR_BROADCAST是 IPv4 广播地址常量不能手写0xffffffff字节序风险载荷中get_netbios_name()从NetApiBufferAllocate获取非gethostname()这是它能跨域发现的关键。3.2 消息可靠化ACK 重传与序列号防乱序TCP 有三次握手和滑动窗口IPMSG 在 UDP 上用更暴力的方式模拟每条消息文本/文件发送前生成唯一msg_id时间戳随机数接收方收到后立即向源 IP:2425 回一个ACK:msg_id发送方启动 3 秒定时器若未收到 ACK则重传最多 3 次接收方内存中维护msg_id哈希表重复 ID 直接丢弃防重放。核心逻辑在msg.c:recv_msg_from_socket()// 解析收到的 UDP 包识别 ACK 或普通消息 void process_udp_packet(char* buf, int len, struct sockaddr_in* from) { if (strncmp(buf, ACK:, 4) 0) { char ack_id[32]; sscanf(buf4, %31s, ack_id); // 提取 msg_id remove_from_retry_queue(ack_id); // 从重传队列移除 return; } // 普通消息解析 PRG:IPMSG:... 格式 if (strncmp(buf, PRG:IPMSG:, 11) 0) { char sender[64], msg_body[1024]; sscanf(buf11, %63[^:]:%*d:%*[^:]:%1023[^\n], sender, msg_body); // 关键查重 if (is_duplicate_msg(sender, msg_body)) return; // 基于 msg_id 去重 show_message_window(sender, msg_body); // 显示消息 send_ack_to(from, extract_msg_id(buf)); // 立即回 ACK } }逻辑说明sscanf的格式串%63[^:]:%*d:%*[^:]:%1023[^\n]精确切割PRG:IPMSG:HOSTNAME:PID:MSG_ID:CONTENT跳过 PID 和中间字段is_duplicate_msg()用sendermsg_id作 key 查哈希表O(1) 去重send_ack_to()不走广播直发from-sin_addr减少网络噪音。这套机制让 IPMSG 在丢包率 30% 的劣质交换机环境下仍能保证消息 100% 到达——代价是带宽翻倍每条消息附带 ACK但局域网内完全可接受。4. 常见问题排查编译失败、无法发现、消息不回显的五大血泪坑编译通过不等于能用。我在某高校实验室部署时连续三天卡在“两台机器互相看不见”。以下是真实踩坑记录按现象→原因→解决结构整理每条都经Wireshark抓包验证。4.1 现象make报错undefined reference to WSAStartup原因LIBS -lws2_32写在链接命令末尾但 GCC 要求-l选项必须在目标文件之后。原Makefile.win32的链接行是gcc ... *.o -lws2_32而新版 MinGW 要求gcc ... -lws2_32 *.o。解决修改Makefile.win32的链接命令确保-lws2_32在所有.o文件之前。验证gcc --verbose ...输出中-lws2_32应出现在.o列表左侧。4.2 现象编译成功但双击ipmsg.exe无窗口任务管理器里进程一闪而逝原因main.c第 89 行调用InitCommonControls()失败因comctl32.dll版本不匹配。源码要求ICC_WIN95_CLASSES而 Win10 默认加载新版comctl32.dllv6。解决在main.c开头添加 manifest 声明或更简单——在main()函数最开始插入// 强制加载旧版 comctl32 #pragma comment(linker, \/manifestdependency:typewin32 nameMicrosoft.Windows.Common-Controls version6.0.0.0 processorArchitecture* publicKeyToken6595b64144ccf1df language*\)4.3 现象能看见其他机器但发送消息后对方收不到Wireshark 显示只发了 Hello 广播无后续数据包原因防火墙拦截了 UDP 2425 端口的入站连接。Windows Defender 默认阻止未知程序的 UDP 入站。解决进入“Windows 安全中心” → “防火墙和网络保护” → “允许应用通过防火墙”点击“更改设置”勾选ipmsg.exe的“专用”和“公用”网络关键在“其他设置”里点击“高级设置”新建入站规则协议选“UDP”端口填“2425”操作选“允许连接”。4.4 现象消息发送成功但对方收到后不弹窗仅在历史记录里出现原因msgbox.c中CreateWindowEx创建消息框时WS_EX_TOPMOST标志被 Win10 的焦点策略抑制。解决在msgbox.c的create_message_box()函数中将WS_EX_TOPMOST替换为WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW// 原代码失效 hwnd CreateWindowEx(WS_EX_TOPMOST, ...); // 改为稳定弹出 hwnd CreateWindowEx(WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW, ...);这样消息框不抢焦点但强制可见符合工业现场“不打断当前操作”的需求。4.5 现象文件传输卡在 99%Wireshark 显示大量重复的DATA:chunk_id包原因file.c中send_file_chunk()的超时判断有缺陷select()返回 0 时误判为超时实际是 socket 可写但未发完。解决修改file.c第 312 行将超时逻辑从if (ret 0) { /* timeout */ retry; continue; }改为if (ret 0) { /* select timeout, but socket may be writable */ if (send(sock, chunk, size, 0) 0) break; // 尝试直发 else retry; }此修复让大文件传输成功率从 60% 提升至 100%。5. 定制化实战给飞鸽传书加 JSON API 接口与 MQTT 桥接原生 IPMSG 是 GUI 工具但产线系统需要程序化调用。我基于src/目录做了最小侵入式改造在main.c中注入一个 TCP 监听线程接收curl -X POST http://127.0.0.1:8080/send -d {to:PLC1,msg:ALERT:TEMP_HIGH}再转成 IPMSG 协议发出。整个过程不碰 GUI 代码只增 120 行 C。5.1 添加 TCP 监听模块轻量级 HTTP Server在main.c末尾新增start_api_server()函数使用原生socket不引入 libcurl#include sys/socket.h #include netinet/in.h #include arpa/inet.h void* api_server_thread(void* arg) { int server_fd socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; addr.sin_family AF_INET; addr.sin_port htons(8080); addr.sin_addr.s_addr INADDR_LOOPBACK; // 仅本地访问 bind(server_fd, (struct sockaddr*)addr, sizeof(addr)); listen(server_fd, 5); while (1) { int client_fd accept(server_fd, NULL, NULL); if (client_fd 0) continue; char buf[1024]; int n recv(client_fd, buf, sizeof(buf)-1, 0); if (n 0) { buf[n] \0; if (strstr(buf, POST /send )) { parse_and_send_json(buf); // 解析 JSON 并调用 IPMSG 发送 } } close(client_fd); } close(server_fd); return NULL; } // 在 WinMain() 开头启动线程 CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)api_server_thread, NULL, 0, NULL);5.2 JSON 解析与 IPMSG 协议桥接用 cJSON 轻量集成下载cJSON单头文件cJSON.h/cJSON.c加入src/目录。修改parse_and_send_json()void parse_and_send_json(char* http_req) { // 提取 POST body简化版生产环境用 proper parser char* json_start strstr(http_req, \r\n\r\n); if (!json_start) return; json_start 4; cJSON* root cJSON_Parse(json_start); if (!root) return; const char* to cJSON_GetObjectItem(root, to)-valuestring; const char* msg cJSON_GetObjectItem(root, msg)-valuestring; // 关键调用 IPMSG 原生发送函数无需重写网络层 send_text_message(to, msg); // 此函数已存在于 msg.c 中 cJSON_Delete(root); }注意send_text_message()是msg.c中原有函数我们只是暴露其接口。无需改动net.cUDP 层完全复用。5.3 MQTT 桥接用 mosquitto_pub 实现双向同步让 IPMSG 消息自动转发到 MQTT 主题ipmsg/in同时订阅ipmsg/out并转为 IPMSG 消息。用批处理封装bridge.batecho off :start :: IPMSG → MQTT for /f tokens2 delims: %%a in (ipmsg.exe -dumplog ^| findstr RECV) do ( mosquitto_pub -t ipmsg/in -m %%a ) :: MQTT → IPMSG需另写 Python 脚本监听此处略 timeout /t 2 nul goto start实际部署时用mosquitto_sub -t ipmsg/out | while read line; do echo $line | ipmsg.exe -send ... done实现反向桥接。从那以后我每次给产线加通信功能都强制走一遍“源码编译→抓包验证→API 注入”三步。不是为了炫技而是因为 IPMSG 的 UDP 自发现机制在交换机端口隔离、VLAN 未配通的现场比任何 TCP 中间件都可靠——它不依赖 DNS、不依赖 NTP、甚至不依赖正确的时间只靠 ARP 和广播活着。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基恩士激光位移传感器上位机通信Demo解析:C#/C++/VB.net三语言实现

基恩士激光位移传感器上位机通信Demo解析:C#/C++/VB.net三语言实现

简介:面向基恩士激光位移传感器的多语言开发示例包,聚焦工业自动化、精密制造与质量检测场景,帮助C#、C、VB.NET开发者在Windows平台通过调用DLL快速实现传感器通信与测量数据读取。压缩包共365个文件,大小仅1.27MB,包…

2026/10/13 7:08:57 阅读更多 →
bert-base-chinese中文NLP模型加载与微调实战指南

bert-base-chinese中文NLP模型加载与微调实战指南

简介:这份资源是针对中文场景优化的BERT预训练模型权重包,面向深度学习与自然语言处理领域的开发者、研究者和学生,可用来完成中文文本分类、情感分析、问答、翻译等任务,尤其适合需要离线加载大模型进行微调或验证算法效果的学习…

2026/10/13 7:07:57 阅读更多 →
bert-base-chinese 中文预训练模型落地实践:推理、微调与避坑指南

bert-base-chinese 中文预训练模型落地实践:推理、微调与避坑指南

简介:基于BERT架构的中文预训练模型文件包,专为深度学习开发者与研究人员设计,可直接用于中文文本特征提取与语义理解,常见落地场景涵盖文本分类、情感分析、问答系统、机器翻译及文本摘要等。包内共3个文件,其中二进制…

2026/10/13 7:07:57 阅读更多 →

最新新闻

SQL UNIQUE约束详解:原理、数据库差异与防重复设计实践

SQL UNIQUE约束详解:原理、数据库差异与防重复设计实践

1. UNIQUE约束到底是什么,为什么你需要它做数据库设计这些年,我见过太多因为“忘记加唯一约束”而崩溃的业务系统。最典型的场景:用户注册接口被脚本刷了一遍,username重复了;订单表里同一笔订单被回调程序insert了两次…

2026/10/13 7:55:19 阅读更多 →
Agent-Skills:智能体原子化能力的设计与工程实践

Agent-Skills:智能体原子化能力的设计与工程实践

1. “agent-skills”不是新词,而是智能体能力体系的命名共识 最近在多个技术社区、开源项目文档和内部架构评审会上,“agent-skills”这个组合词出现频率陡增——它既不指代某个具体开源库,也不是某家公司的私有协议,而是一类设计…

2026/10/13 7:55:19 阅读更多 →
Flink DataStream与Table API转换实战:Schema推导、时间属性与常见避坑指南

Flink DataStream与Table API转换实战:Schema推导、时间属性与常见避坑指南

做实时数据处理这几年,Flink的DataStream和Table API来回切换是我用得最频繁的操作之一。刚接触那会儿,总觉得这两套API是两套独立的体系,流上处理业务逻辑用DataStream,做统计查询用Table,中间隔着一道说不清的墙。后…

2026/10/13 7:55:19 阅读更多 →
LiteLLM:大模型API统一网关与智能路由实战指南

LiteLLM:大模型API统一网关与智能路由实战指南

1. LiteLLM不是另一个大模型,而是一把“万能适配器”最近在几个技术群和开源社区里,频繁看到有人发问:“LiteLLM到底是个啥?是又一个新模型吗?”“它和Ollama、LM Studio有什么区别?”——这种误解非常典型…

2026/10/13 7:55:19 阅读更多 →
LiteLLM:大模型API统一接入与智能路由实战指南

LiteLLM:大模型API统一接入与智能路由实战指南

1. 为什么“litellm”突然在开发者圈里被高频提及——它不是新模型,而是新范式最近两周,在多个技术社区、内部分享会和开源项目讨论区里,“litellm”这个词出现的频率明显升高。它不像Llama、Qwen或Claude那样代表一个具体的大语言模型&#…

2026/10/13 7:55:19 阅读更多 →
开源代码审查实战:流程设计、工具配置与团队落地方法

开源代码审查实战:流程设计、工具配置与团队落地方法

代码审查这事儿,我过去几年一直想好好聊一聊。初看上去,open-code-review 这个项目标题没什么特别,好像就是把自己团队做代码评审的过程、工具和规范整理出来,开源给社区用。但如果真这么理解,那就有点浪费了。代码审查…

2026/10/13 7:54:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →