跑起来
2 分钟单头验证与四条网络实操路线。
第二步接入工程
构建系统、发布形态与特性裁剪。
第三步理解全貌
仓库结构、并发模型、模块地图与扩展库。
之后学习与查阅
100 章教程、API 参考手册与稳定性证据。
2.0.0-dev。用一个 C 文件,开始使用 XRT
打开仓库中的 single/xrt.h,通过 Raw / 下载按钮保存到当前目录,再新建 main.c。
#define XRT_IMPLEMENTATION #include "xrt.h" #include <stdio.h> int main(void) { printf("XRT %s\n", XRT_VERSION_TEXT); return 0; }
cc -std=c11 -O2 main.c -o hello ./hello
gcc -std=c11 -O2 main.c -o hello.exe .\hello.exe
预期输出:XRT 2.0.0-dev。上方最小示例无需额外链接网络系统库;启用网络功能时,由仓库构建工具配置平台链接选项。
HTTP / HTTPS 客户端
从一个已验证的同步 GET 客户端开始,输出状态码与响应正文;下一步进入异步 Future、Cookie、重试和连接池。
extlibs/xhttp/examples/http/client_easy/main.cHTTPS:client_https/main.c成功标准:收到状态码与响应正文TCP Echo 服务
启动回环监听、回显客户端数据,再按需深入硬背压、连接关闭与服务端生命周期。
examples/network/tcp_server/main.c监听:127.0.0.1:动态端口成功标准:输出监听端点并完成一轮回显TLS 请求与证书验证
使用系统信任库建立 HTTPS 请求。默认路径包含 DNS、TCP、TLS 1.3、SNI、证书身份验证与 HTTP/1.1。
extlibs/xhttp/examples/http/client_https/main.c输入:一个 https:// URL成功标准:secure=yes 与响应大小HTTP 服务端与健康检查
启动一个原始响应服务端,对 /health 返回 JSON;其他路径返回 404。它也是性能基准中 raw 路径的基础。
extlibs/xhttp/examples/http/server_raw/main.c端点:/health成功标准:返回 {"code":200,"msg":"OK"}构建系统与已验证示例
网络示例位于仓库 examples/ 与扩展库的 examples/,
可结合对应测试套件学习调用与生命周期。统一构建入口 tools/build.py 提供:
SHA256 指纹增量编译、模块依赖闭包展开、Windows 长命令自动切换响应文件;
GCC / Clang / MSVC(含 clang-cl)/ TCC 四族编译器可互换。build.bat 与 build.sh 只是它的薄封装。
git clone https://gitee.com/xywhsoft/xrt.git cd xrt # 默认:构建并运行内核测试(Windows 用 build.bat,Linux/macOS 用 ./build.sh) python tools/build.py # 指定套件:模块名、逗号组合或 all;--jobs 并行,--start-test 从失败处续跑 python tools/build.py --suite core,concurrency --jobs 4 python tools/build.py --suite all --start-test test_http_client # 扩展库:叠加扩展清单 python tools/build.py --manifest extlibs/xhttp/config/modules.json --suite xhttp_tests python tools/build.py --manifest extlibs/xws/config/modules.json --suite xws_tests # 打包静态库 / 动态库,并编译运行消费者程序验证 python tools/package.py --kind static --verify python tools/package.py --manifest extlibs/xhttp/config/modules.json --kind shared --verify # 单头产物再生成(支持 --manifest 与 --check 漂移校验) python tools/amalgamate.py
选择发布形态
单头(适合快速集成)
/* single/xrt.h 自包含全部实现;扩展库同理(如 extlibs/xhttp/single/xhttp.h) */ #define XRT_IMPLEMENTATION #include "xrt.h"
模块化 / 库(适合工程集成)
用 tools/package.py 产出静态库或动态库(含导入库),或直接把内核源码纳入你的构建——
模块清单已经声明每个源文件的归属与依赖。头文件路径统一为 <xrt/xxx.h>。
按项目边界选择,而不是按术语选择:原型与工具用单头,产品构建用库。
特性裁剪体系
裁剪以模块宏为单位:定义 XRT_MODULE_<NAME> 后,include/xrt/features.h
(由 tools/generate_features.py 从 modules.json 生成)自动展开其依赖闭包并置位对应的
XRT_FEATURE_* 宏;缺失依赖会在头文件中直接 #error。
/* 只要 TCP 网络与协程 */ #define XRT_MODULE_NET_TCP #define XRT_MODULE_COROUTINE #include "xrt.h" /* 全部启用 */ /* #define XRT_MODULE_ALL */
裁剪的正确性由两道门禁保证:
- trim 反向验证(
build.py --trim-only):对每个模块故意去掉其直接依赖宏,要求编译必须失败,防止守卫缺失。 - 符号禁令(
measure_size.py):最小 core 裁剪产物禁止出现xrtNet / xrtHttp / xrtWs / xrtTls / xrtRegex等前缀符号,二进制级防止功能蔓延。
扩展库有平行的宏体系(XHTTP_MODULE_*、XWS_MODULE_*…),由 generate_extension_features.py 生成,并连锁要求内核模块宏。
认识 XRT
XRT 是一整套成体系的跨平台 C 基础设施库,目标是在互联网 + AI 时代提供零第三方运行时依赖的完整基础设施闭环。 v2.0 起,仓库分为两部分:
- 内核(
src/+include/xrt/):并发协程、五后端网络引擎、TLS、HTTP/WebSocket 协议核心、内存与容器、文件与进程、正则与模式匹配。公开头文件 94 个;模块清单声明 386 个不同的特性宏。 - 扩展库(
extlibs/):五个按领域拆分的独立产品——xhttp、xws、xruntime、xmail、xssh。每个都是自包含小项目(自己的 src / include / tests / examples / config / single),单向依赖内核。正则库 xregex 已并入内核regex模块。
两种消费形态:模块化源码 / 静态库 / 动态库,或者自包含单头(内核与每个扩展库各有单头产物)。
仓库结构导览
| 目录 | 内容 |
|---|---|
include/xrt/ | 内核公开头文件。所有导出函数使用 XRT_API 宏与 xrt 前缀。 |
src/ | 按能力领域组织的内核实现,配套 src/internal/ 私有契约头。 |
extlibs/ | 五个扩展库。公开头沿用 xrt/ 命名空间安装(如 <xrt/http_client.h>),门面头为 <xhttp.h>、<xws.h> 等。 |
config/modules.json | 内核模块清单——单一事实源:每个模块的头文件、源码、测试、示例与依赖关系。 |
tools/ | 工具链入口:build.py(构建)、package.py(打包)、amalgamate.py(单头合并)、measure_size / measure_performance(测量)、generate_features / generate_api_reference(生成器)。 |
tests/ | 内核测试;tests/single/ 提供单头构建与调用探针。 |
examples/ | 按模块组织的示例,从初始化、调用到资源释放展示完整流程。 |
single/ | 内核单头产物 xrt.h / xrt_decl.h。 |
fuzz/ | libFuzzer 目标(HTTP/WS 协议等)。 |
dev/ | 性能基准(带日期报告)、受控归档、开发流程资产。 |
并发模型:按问题选择,不必全都使用
线程、协程、Channel、Future、任务组与取消令牌分别解决不同边界。先确认工作是否需要真实并行、等待 I/O、传递消息、组合结果,还是需要统一停止;再选最小的一组机制。
| 机制 | 优先使用的场景 | 边界与下一步 |
|---|---|---|
| 线程与同步 | CPU 并行、阻塞接口集成、共享状态保护。 | 使用 mutex / rwlock / cond / sem / once 明确共享边界;从 第 52 章 开始。 |
| 有栈协程与调度器 | I/O 等待、可读性优先的分步流程、定时与恢复。 | 协程在调度器中协作运行,不替代 OS 线程;阅读 第 54 章、第 55 章。 |
| Channel / select | 生产者消费者、跨执行单元交接工作、同时等待多个消息来源。 | 以消息传递缩小共享状态范围;阅读 第 56 章。 |
| Future / Promise | 组合异步完成事件,继续、汇聚、竞速或失败处理。 | 使用 then / catch / any / all / race 描述结果依赖;阅读 第 57 章。 |
| executor / task group | 复用线程池、批量提交和等待一组受控工作。 | 将执行资源与任务范围分开;阅读 第 58 章。 |
| deadline / cancel | 请求超时、连接关闭、服务停止或需要中止一条任务链。 | 让停止信号沿取消令牌树传递,并在退出前完成必要清理;阅读 第 59 章。 |
建议学习顺序
先掌握线程与同步,再理解协程调度;随后用 Channel 和 Future 组织工作流,最后把 executor、task group 与取消组合进服务生命周期。
仓库可直接对照 examples/concurrency/thread、coroutine、channel_select、future_combine、task_group 与 cancel 示例。
内核模块地图
按体系分组的模块速查(公开头位于 include/xrt/;完整的逐 API 文档见 API 参考手册):
| 体系 | 模块 / 头文件 |
|---|---|
| 地基 | core error error_format atomic memory memory_debug math hash random xid |
| 数据与容器 | array map set avl list buffer queue(MPMC/MPSC/SPSC)slot_map value json xlon jsonl xlonl string charset number html regex pattern codec compress template |
| 并发 | coroutine channel future future_bridge executor task cancel mutex/cond/sem/rwlock/once |
| 系统服务 | file file_async path process signal logger io time environment console |
| 网络 | net tcp udp proxy net_frame net_file net_interface |
| 安全 | crypto asn1 pem x509 tls tls_client tls_server tls_session tls_stream |
| Web 协议 | http http1 http1_net http1_tls http_connection http_decode http_encoding http_te http_trailer http_upgrade websocket websocket_stream websocket_upgrade |
扩展库指南
每个扩展库目录结构一致:src/ include/ tests/ examples/ bench/ config/modules.json single/ docs/。公开头沿用 xrt/ 命名空间,与内核头无缝拼接。
xhttp — HTTP 客户端与服务端
入口 <xhttp.h>;分层头 <xrt/http_client.h>、<xrt/http_server_runtime.h> 等 70 个。含 URL / Query / Form / MIME / Cookie / SSE / multipart / 静态文件。错误组件名 "xhttp"。
xws — WebSocket 运行时
入口 <xws.h>;运行时 API 在 <xrt/websocket_runtime.h>。客户端复用 xhttp 整个栈(代理 / Cookie / 超时全部生效),支持组播与零拷贝发送。
xruntime — 动态类型与对象系统
入口 <xruntime.h>;类型注册表、引用计数对象、对象图回收、动态调用、typed 容器投影(<xrt/typed_*.h>)。
xmail — 邮件协议套件
SMTP(STARTTLS / BDAT / XOAUTH2)、IMAP4(IDLE / COMPRESS=DEFLATE / BODYSTRUCTURE)、POP3、MIME 解析构建与 RFC 2047/2231 编解码。
extlibs/xmail/ · 51 模块xssh — SSH2 协议栈
传输层、curve25519-sha256 KEX、ssh-ed25519 主机密钥、AES-GCM 加密、password/publickey/hostbased/keyboard-interactive 认证、通道与端口转发。
extlibs/xssh/ · 68 模块测试与示例的组织
测试文件名后缀编码了测试维度,同一契约会以多个变体出现(如 test_http_client_iocp.c
只有一行 #define + #include "test_http_client.c"):
| 后缀 | 含义 |
|---|---|
_oom | OOM 故障注入:第 N 次分配精确失败 / 预算耗尽 / 全失败 |
_noalloc | 零堆分配契约:操作全程禁止分配 |
_iocp / _uring / _epoll / _kqueue / _select | 按事件后端独立实例化 |
_threads / _race | 多线程并发 / 精确控制的竞态窗口 |
_tls | TLS 链路变体 |
_mutation / _fuzz / _stress | 变异等价 / 确定性随机模糊 / 压力 |
tests/single/ | 单头等价性探针(合并产物 = 模块化构建) |
内核与五个扩展库提供 680 个示例 C 文件和 2,512 个测试 C 文件。通过模块清单找到对应源码与构建入口,沿调用流程深入实现。
建议学习路径
- 跑通构建:
python tools/build.py --suite core,观察指纹增量与测试输出。 - 读示例:从
examples/挑选感兴趣模块的main.c,理解初始化、调用和资源收尾。 - 读测试:结合
tests/<模块>/中的断言,理解接口行为与边界条件。 - 裁剪上手:用
XRT_MODULE_*宏裁出你需要的最小集合,--trim-only验证。