UDP数据报套接字编程实战:C语言实现与可靠性补全
做网络编程绕不开UDP数据报套接字编程。我在给某跨平台系统做实时通信模块时试过直接用TCP结果在高并发低延迟场景下吃了不少苦头后来换成UDP数据报套接字整个方案才算顺畅。这篇内容就是我实际用C语言从零写UDP收发程序的经验整理从socket创建到sendto/recvfrom的每个参数细节再到丢包排查和可靠性补全方案一次性讲清楚。适合刚接触网络编程的初学者也适合那些需要用UDP做实时数据传输、音视频通信、游戏同步或IoT设备上报的开发者参考。1. UDP数据报套接字的本质拆解1.1 为什么选UDP从一次踩坑说起之前做某实时通信Demo的时候我一开始想当然用了TCP。逻辑很简单TCP可靠、有序、有连接管理看起来什么都替你想好了。结果一上线就发现两个问题。第一TCP的粘包和拆包处理非常麻烦我需要自己在应用层定义帧格式和缓冲机制代码量一下子膨胀。第二也是最致命的TCP的拥塞控制和重传机制在弱网环境下会把延迟拉得很高一个数据包丢了后续数据全被堵住实时性完全没法保证。后来我把核心链路换成UDP数据报套接字才真正明白UDP的定位。UDP是一个面向数据报的传输层协议它在IP层之上只做了两件事端口复用和数据校验校验和。它不保证数据一定到达不保证到达顺序也不维护连接状态。很多人一听不可靠就觉得它没用但恰恰是这份不负责任换来了极低的额外开销和完全由应用层控制的灵活性。TCP的可靠性是内核帮你实现的UDP的可靠性则需要你自己在应用层用代码去定义——这是两种完全不同的设计哲学。1.2 数据报模型一条消息就是一个完整单位UDP和TCP在编程模型上的根本差异可以从流和报这两个字来体会。TCP是字节流模型内核帮你把数据切成段再在接收端按序拼回接收方看到的是一串无边界的数据流UDP是数据报模型你调用一次sendto发送的内容在接收端一次recvfrom就能完整收到一条报文从发送到接收始终作为一个整体存在。这个特性在实际编程里带来两个直接影响。第一不需要自己处理粘包和拆包每条消息天然有边界。第二单次发送的数据量受限于底层网络MTU通常以太网是1500字节刨去IP头和UDP头各20字节和8字节最稳妥的单包数据应该控制在1472字节以内超过这个值就容易触发IP分片虽然上层看起来还能收但传输效率和丢包概率都会变差。这也是做UDP通信必须记住的第一个经验值不要把单条消息写得太大。1.3 适用场景哪里该用UDP判断一个场景适不适合用UDP我问自己三个问题数据是否允许丢失延迟是否比可靠性更敏感通信双方是否需要维持长连接状态如果数据丢了重发就行或者本就不需要重发那UDP就是对的。像DNS域名解析、NTP时间同步、语音视频通话、在线游戏的玩家位置同步、IoT设备的状态上报这些都是UDP的主场。而文件传输、数据库事务、网页加载这种一个字节都不能错的场景还是老实交给TCP。我自己做的某实时状态上报模块客户端每200毫秒上报一次设备状态服务器端只关心最近一次状态根本不关心历史状态是否全部到达。这种场景如果用TCP网络抖动时反而会因为重传导致延迟堆积状态信息全卡在缓冲区里出不来。换成UDP数据报套接字后丢一个包也无所谓下一帧马上补上整体实时性一下就上来了。2. 核心API与关键参数深度解析2.1 socket()套接字创建的三要素UDP编程的第一步是调用socket函数创建套接字它的签名是int socket(int domain, int type, int protocol)。三个参数决定套接字的身份。domain指定协议族IPv4网络编程几乎都用AF_INETtype指定套接字类型UDP对应的是SOCK_DGRAM数据报套接字protocol直接填0让内核根据前两个参数自动推导出UDP协议。这里有一个值得展开的点为什么UDP对应SOCK_DGRAM而不是别的在Linux的套接字设计里type参数决定的是套接字的行为语义。SOCK_DGRAM表示这个套接字以消息为单位收发数据每次发送都是独立的数据报接收端也会按消息边界接收。这套语义正好和UDP协议相匹配。对比之下SOCK_STREAM对应TCP的字节流语义。选对type基本上就确定了整个套接字的行为模式。2.2 sendto与recvfrom收发一体的核心函数UDP和TCP在收发函数上有个显著区别TCP用send和recv因为连接建立后目标地址已经绑定在套接字上了UDP没有连接每个数据报都可能发往不同的目的地所以收发函数必须带上完整的地址信息。sendto和recvfrom完全可以同时使用只要你不调用connectUDP也可以connect但它只做地址绑定不建立真正连接UDP套接字天然就支持一个套接字多个对端。sendto的原型是ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);recvfrom的原型是ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);注意看recvfrom的第6个参数是指针类型函数返回时会填入对端的IP和端口。这一点在处理多客户端通信的时候尤其重要你要回复某条消息就必须知道这条消息来自哪里。我在项目里经常看到新手把addrlen初始化成0或者忘记初始化导致recvfrom直接返回错误这个细节踩过的人不在少数。2.3 bind与地址结构体端口绑定的门道服务器端必须调用bind把自己的IP和端口绑定到套接字上否则内核会随机分配一个端口客户端根本不知道往哪里发。bind接收一个sockaddr_in结构体这个结构体在IPv4编程里是绕不开的。struct sockaddr_in { sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 端口号网络字节序 */ struct in_addr sin_addr; /* IP地址 */ };有两个字节序转换的细节必须说清楚。第一端口号必须用htons()从主机字节序转换成网络字节序写作htons(8888)。第二IP地址的处理有几种方式监听所有网卡用htonl(INADDR_ANY)指定具体IP用inet_addr(192.168.1.100)推荐用inet_pton更规范。很多人端口绑定失败问题往往就出在忘了htons或者用了INADDR_ANY却忘了htonl包一层虽然数值上有些平台恰好相同但在大端平台上就会出玄学问题。客户端要不要bind通常不需要。客户端只负责发数据内核会自动为它分配一个临时端口对端回复时这个临时端口就作为返回地址。只有在特殊场景下比如客户端需要固定的源端口供服务器做白名单验证时才需要主动bind。3. 实操从零搭建UDP回声服务器与客户端3.1 服务器端完整实现我直接给出一套可以直接编译运行的UDP回声服务器代码功能是收一条消息就原样回显一条。代码不长但覆盖了UDP服务端的所有核心环节创建套接字、绑定端口、循环接收、解析对端地址、回发数据。#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len sizeof(client_addr); char buffer[BUFFER_SIZE]; sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd 0) { perror(socket创建失败); exit(EXIT_FAILURE); } memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr htonl(INADDR_ANY); server_addr.sin_port htons(PORT); if (bind(sockfd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) { perror(bind失败); close(sockfd); exit(EXIT_FAILURE); } printf(UDP服务器已启动监听端口 %d\n, PORT); while (1) { addr_len sizeof(client_addr); int n recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)client_addr, addr_len); if (n 0) { perror(recvfrom失败); continue; } buffer[n] \0; printf(收到来自 %s:%d 的消息: %s\n, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer); sendto(sockfd, buffer, n, 0, (struct sockaddr *)client_addr, addr_len); } close(sockfd); return 0; }几个细节值得说。首先recvfrom的第5个参数是struct sockaddr *类型但传入的实际上是一个sockaddr_in的指针并用(struct sockaddr *)做了一次强制转换。这是POSIX socket API的老传统函数本身接受通用的sockaddr指针具体是IPv4还是IPv6由第一个字段sin_family来区分这是一种早期的多态设计。其次addr_len在每次调用前都要重新赋值成sizeof(client_addr)因为recvfrom会把这个值改写为实际地址长度如果循环里不重置第二次调用就可能出问题这一点我在正式项目里踩过。3.2 客户端完整实现客户端的代码更简单核心就是创建套接字、填服务器地址、sendto发送、recvfrom接收回显。#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #define SERVER_PORT 8888 #define BUFFER_SIZE 1024 int main(int argc, char *argv[]) { if (argc ! 3) { printf(用法: %s 服务器IP 消息\n, argv[0]); exit(EXIT_FAILURE); } int sockfd; struct sockaddr_in server_addr; socklen_t addr_len sizeof(server_addr); char buffer[BUFFER_SIZE]; sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd 0) { perror(socket创建失败); exit(EXIT_FAILURE); } memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr inet_addr(argv[1]); server_addr.sin_port htons(SERVER_PORT); strncpy(buffer, argv[2], BUFFER_SIZE - 1); buffer[BUFFER_SIZE - 1] \0; sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)server_addr, addr_len); printf(已发送: %s\n, buffer); int n recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)server_addr, addr_len); if (n 0) { perror(recvfrom失败); } else { buffer[n] \0; printf(收到回显: %s\n, buffer); } close(sockfd); return 0; }这个客户端有个典型特点它不调用bind直接sendto。内核会在第一次sendto时自动给这个套接字分配一个临时端口之后recvfrom就能收到服务器回发的数据。如果你在客户端手动bind了一个固定端口记得测试前确认这个端口没被占用否则套接字创建和绑定都成功但数据收发可能因为端口冲突出现诡异现象。3.3 编译、运行与验证两个文件分别保存为udp_server.c和udp_client.c然后编译gcc -o udp_server udp_server.c gcc -o udp_client udp_client.c先在一个终端启动服务器./udp_server输出UDP服务器已启动监听端口 8888再开另一个终端运行客户端./udp_client 127.0.0.1 hello udp客户端会打印已发送: hello udp紧接着服务器终端打印收到来自 127.0.0.1:xxxxx 的消息: hello udp客户端再打印收到回显: hello udp。整个流程就跑通了。如果要在两台机器上测试把服务器IP换成实际的局域网地址同时注意防火墙要放行UDP端口。我之前在公司测试机上排查了半天代码怎么看都对最后发现是防火墙默认拦了UDP入站。Linux上用iptables放行具体端口就行本地开发环境也可以暂时关闭防火墙但要记得测试完恢复。4. 常见问题与排查技巧实录4.1 端口被占用bind失败的经典场景UDP服务器启动时最常遇到的错误就是bind失败报错信息一般是Address already in use。原因通常是上一个服务器进程还没退出或者进程崩溃但端口处于TIME_WAIT状态。排查方法很简单用netstat或ss命令看端口占用情况sudo ss -ulnp | grep 8888u表示UDPl表示监听n表示数字显示p表示显示进程。如果看到端口被某个进程占着用kill结束它或者换一个端口。需要注意的是TCP和UDP的端口空间是独立的也就是说TCP的8888端口被占用并不影响UDP的8888端口绑定。很多人看到TCP的8888被占就以为UDP也没法用其实是误解。反过来同理。4.2 收不到数据显示发送成功ICMP端口不可达的陷阱UDP编程最让人头疼的问题就是sendto返回值正常甚至显示了字节数但对端就是没收到。我当年排查这种问题费了不少劲。核心原因在于UDP协议本身没有确认机制sendto成功只代表数据交给了内核不代表对端收到了。如果对端端口根本没有进程监听或者网络不通发送端可能会收到一个ICMP端口不可达报文但sendto不会因此报错真正的错误要等下一次发送或调用connect之后才能暴露出来。碰到这种情况我建议按这个顺序排查。第一步对端是否真的启动并监听了端口用ss在服务器端确认。第二步服务器和客户端是否在同一网段互相ping一下。第三步防火墙有没有拦UDP这个非常容易忽略。第四步也是最容易被忽略的对端recvfrom的缓冲区长度是否比发送端的数据量大如果recvfrom的接收数组只有64字节你发个1000字节的消息recvfrom会返回Message too long错误数据直接被截断甚至丢弃。4.3 缓冲区设置UDP丢包的隐形杀手UDP接收缓冲区的大小直接影响丢包率。内核默认的接收缓冲区通常不大在发送端疯狂发包的情况下接收端如果处理不及时数据就会在socket接收队列里被丢弃。服务器端可以通过setsockopt调整缓冲区int recv_buf_size 1024 * 1024; /* 1MB */ setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, recv_buf_size, sizeof(recv_buf_size));这里有个细节Linux内核会把SO_RCVBUF的设定值翻倍因为内核还要预留一部分空间做额外开销所以你以为设置了1MB实际生效可能是2MB。这个翻倍机制在文档里不显眼但做高吞吐服务时很有用。另外即便缓冲区调大了UDP的接收队列还是FIFO出队模型如果应用层处理速度跟不上发包速度队列满了照样丢包所以光调缓冲区不够还得在应用层设计好消费逻辑比如用单独的线程专收数据把解析和业务处理异步化。4.4 打包发送效率的误区还有一个经常被翻出来的问题UDP每次sendto是不是发得越小越快实测下来恰恰相反。单个UDP报文的收发有固定开销包括系统调用开销、中断处理、协议栈处理如果一次只发几十字节大部分时间都消耗在固定开销上了。更合理的做法是把多条小消息攒成一条在一个UDP报文里打包传输。我这里说的攒包是指应用层自己定义一个简单的帧结构把多条逻辑消息拼在一个缓冲区里再一次性sendto。实测攒包后的吞吐量提升非常可观但要注意单包大小别超过1472字节否则又会触发IP分片得不偿失。5. 在UDP之上做可靠性从项目实践说起5.1 三条核心经验UDP数据报套接字编程的终局问题永远是在不可靠的通道上构建可靠的业务逻辑。我从几次项目里提炼出三条实践经验。第一条应用层协议必须自带序列号。每条消息在业务格式里加一个自增序号接收方通过序号就能检测出丢包和乱序。这个实现并不复杂发送维护一个计数器写进消息头接收维护一个期望序号序号不连续就知道有包丢了。第二条超时重传要自己控制。UDP没有内核重传机制但并不意味着不能重传。发送后启动一个定时器比如500毫秒没收到对端确认就重发一次。重传次数必须限死超过上限就放弃避免网络不可达时无限占用资源。第三条ACK包要单独设计。我见过不少团队在UDP上做可靠性时把ACK也用在业务报文里捎带结果ACK丢失后两边状态错乱。最稳妥的做法是单独定义ACK报文类型不承载业务数据只做确认。这样做确实会增加一点报文量但逻辑清晰很多排查问题也容易。5.2 控制面与数据面分离的思路做实时通信系统的时候我还用过一套比较成熟的分层思路控制面走TCP数据面走UDP。比如握手认证、参数协商、状态同步这些关键但不能丢的消息放TCP而位置更新、帧数据这种高频但丢了也不致命的消息走UDP。这样既保证了关键控制消息的可靠性又让高频数据享受到UDP的低延迟。这套双通道架构在业界非常普遍也是我从实际项目里验证过的最稳妥的UDP落地方式。缺点是引入了两条连接的管理成本但在实时性要求高的场景下这个代价是值得的。5.3 调试工具与抓包技巧最后分享几个实用的小工具。用tcpdump抓UDP包可以快速确认数据是否真的在网络上流动sudo tdump -i eth0 udp port 8888 -vv这条命令会把eth0网卡上所有UDP 8888端口的报文都打出来包括源地址、目的地址、数据长度。如果抓包能看到报文但程序收不到问题一定出在应用层或防火墙如果抓包根本看不到任何报文说明数据压根没出本机或者出发的网卡不对多网卡机器尤其要注意路由表指向。普通的socket调试器工具虽然方便但遇到协议细节问题还是tcpdump这类抓包工具最靠谱。我在做某跨平台系统的网络模块时靠这套抓包定位、分段排查、双通道分离的方法把UDP通信的稳定性从最初的频繁丢包逐步优化到长时间运行零业务丢包。整个过程让我对UDP数据报套接字的理解深了好几层。说实话UDP编程的入门门槛比TCP低因为函数少、结构简单但真正把它用好恰恰需要在数据传输的可靠性、实时性和代码复杂度之间找到平衡点。这也是为什么我建议每个开发者哪怕工作中只在TCP里打转也值得亲手写一个UDP回声程序再把丢包和乱序的问题亲手模拟一遍。只有踩过UDP的坑才能真正理解网络协议栈里每一层设计的用意。

相关新闻

STEP7_HSPs硬件支持包安装与GSD协同配置指南

STEP7_HSPs硬件支持包安装与GSD协同配置指南

简介:本资源是西门子STEP7 V5.X系列编程软件的官方级热修复服务包(HSPs),专为工业自动化领域PLC工程师、系统集成商及产线维护技术人员设计,用于解决V5.1/V5.2/V5.3等各小版本中已知的功能缺陷、兼容性问题与潜在稳定性…

2026/10/16 3:33:05 阅读更多 →
Linux内存卡死优化:从swap颠簸到earlyoom的调优实战

Linux内存卡死优化:从swap颠簸到earlyoom的调优实战

如果你的Ubuntu电脑或者服务器用着用着突然变成“幻灯片”,鼠标一卡一顿,SSD指示灯狂闪,连切个窗口都要等好几秒,那大概率不是CPU不行,而是内存管理出了问题。接触过Linux一段时间的朋友都知道,Windows卡了…

2026/10/16 3:33:05 阅读更多 →
STED超分辨成像:从衍射极限原理到系统搭建与调试实战

STED超分辨成像:从衍射极限原理到系统搭建与调试实战

STED这个名字,在超分辨成像的圈子里几乎无人不晓。它全称是受激发射损耗显微镜(Stimulated Emission Depletion Microscopy),能把普通共聚焦显微镜的分辨率从大约200纳米一直压到30纳米甚至更低,直接突破光学衍射极限。…

2026/10/16 3:33:05 阅读更多 →

最新新闻

三相SVG静止无功发生器Simulink仿真模型:主电路与双闭环控制设计

三相SVG静止无功发生器Simulink仿真模型:主电路与双闭环控制设计

做无功补偿仿真这些年,SVG(静止无功发生器)一直是我觉得最值得研究的装置之一。这次分享的项目,就是基于MATLAB/Simulink的三相静止无功发生器仿真模型,主电路采用电压型桥式结构,除了完整的Simulink源文件…

2026/10/16 4:25:19 阅读更多 →
PaddleOCR中文场景文字识别实践:从环境搭建到模型微调全流程解析

PaddleOCR中文场景文字识别实践:从环境搭建到模型微调全流程解析

做OCR相关开发这几年,我越来越确认一件事:英文场景文字识别和中文场景文字识别,根本是两个难度级别。英文场景里翻来覆去就是 26 个字母加少量数字符号,中文场景里光常用汉字就有三千多个,再加上繁体、生僻字、竖排、倾…

2026/10/16 4:25:19 阅读更多 →
Spring流上传ByteArray越界根因分析:从并发复用改为流式处理

Spring流上传ByteArray越界根因分析:从并发复用改为流式处理

1. 问题现场:这个异常到底长什么样先讲一个我最近处理过的真实案例,某项目上报了一个文件上传偶发报错,接口高峰时段会出现ArrayIndexOutOfBoundsException,日志堆栈差不多长这样:java.lang.ArrayIndexOutOfBoundsExce…

2026/10/16 4:25:19 阅读更多 →
基于PaddleOCR的中文场景文字识别实战:从检测到部署

基于PaddleOCR的中文场景文字识别实战:从检测到部署

上个月团队接了一个票据信息化的临时需求,对方拿来的样张五花八门:机打的增值税发票、手写快递单、混排了横竖文字的营业执照扫描件,还有用户直接在手机上拍的模糊照片。原本以为"调个OCR接口就行",结果接进去才发现&am…

2026/10/16 4:25:19 阅读更多 →
Codex自动化闭环:感知-决策-执行-反馈四层轻量骨架

Codex自动化闭环:感知-决策-执行-反馈四层轻量骨架

1. 项目概述:不是写死的脚本,而是一套能自己“长脑子”的自动化骨架“Codex 多场景自动化:一套闭环,适配所有场景”——这个标题里藏着一个被很多人忽略的关键矛盾:“多场景”和“一套”天然互斥。我们日常见到的所谓“…

2026/10/16 4:25:19 阅读更多 →
离散变量编码三件套:因子化、One-Hot与哑变量实战解析

离散变量编码三件套:因子化、One-Hot与哑变量实战解析

做数据分析这几年,几乎每个项目都会碰到一类让人头疼的字段:里面存的全是文本。地区、渠道、颜色、等级、支付方式……这些在建模时不能直接喂给模型,必须先用某种方式转成数字。这个转换过程,就是我们常说的离散变量处理。但很多…

2026/10/16 4:24:19 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →