
后端网络通信【免费下载链接】libwebsocketscanonical libwebsockets.org networking library项目地址https://gitcode.com/gh_mirrors/li/libwebsockets点击查看免费下载libwebsockets 内置的lws_get_random()默认返回平台随机源而通过故障注入Fault Injection机制可以按 context 粒度将其替换为一个由固定种子驱动的 xoshiro256 伪随机流从而让同一测试在相同调用序列下产出完全一致的字节。仓库中的 api-test-random-prng 正是验证这一能力的官方自测程序。读完本文你将掌握如何编译运行该自测、理解 5 组测试断言背后的原理并学会在自己的测试或移植实现中复现 libwebsockets 的随机字节转录。文档与示例概述api-test-random-prng 是 libwebsockets 低层示例minimal-examples-lowlevel中 api-tests 系列的一员对应可执行文件为lws-api-test-random-prng。其核心作用是用故障注入的种子化 PRNG 替换平台随机源详见 README.fault-injection.md 中 Replacing the random source with a seeded PRNG 一节并逐条验证以下行为当创建信息creation info的 ficfault injection context中包含random_prng故障时context 的lws_get_random()返回从 fic 种子派生出的随机流两个相同种子的 context 抽取相同字节不同种子抽取不同字节在两次抽取之间即使其他故障消费了故障 context 自身的 PRNG也不会推动随机流前进lws_fi_random_seed()可对未注入故障的 context 播种种子 1234 会产出已知向量由 splitmix64 播种的 xoshiro256**结果小端序重放 libwebsockets 转录transcripts的移植实现必须产出相同结果再次播种会重新开始该流既无故障也无显式播种的 context仍然使用平台随机源。该示例需要以-DLWS_WITH_SYS_FAULT_INJECTION1编译其构建约束也直接体现在 CMakeLists.txt 中require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 requirements)未启用该选项时示例不会进入构建。构建与运行与仓库中其他 api-tests 示例一致该程序通过 CMake 构建。官方文档给出的命令为$ cmake .. -DLWS_WITH_SYS_FAULT_INJECTION1 make运行自测$ ./bin/lws-api-test-random-prng [2026/09/29 10:00:00:0000] U: LWS API selftest: seeded random source ... [2026/09/29 10:00:00:0000] U: Completed: PASS程序使用lws_cmdline_option(argc, argv, -d)解析调试级别见 main.c默认日志级别为LLL_USER | LLL_ERR。全部测试通过时输出Completed: PASS并返回 0任一断言失败则累计错误计数并输出Completed: FAIL。此外CMakeLists.txt 还把它注册为 CTest 测试用例api-test-random-prng超时 20 秒因此你也可以在构建目录中用ctest -R api-test-random-prng直接驱动它。底层机制从平台随机到种子 PRNG要理解测试断言先要看清lws_get_random()的分流逻辑。在 lib/core/libwebsockets.c 中size_t lws_get_random(struct lws_context *context, void *buf, size_t len) { #if defined(LWS_WITH_SYS_FAULT_INJECTION) if (context-random_prng) return lws_fi_random(context, buf, len); #endif return lws_plat_get_random(context, buf, len); }当 context 内部标志random_prng置位时随机请求被重定向到lws_fi_random()否则走各平台的lws_plat_get_random()如 Unix 平台从context-fd_random反复read()直至取满见 lib/plat/unix/unix-misc.c。种子流与故障决策流彼此独立实现中有两个互不干扰的 xoshiro256 状态context-random_xos专供lws_get_random()的随机流fic.xos故障注入 contextlws_fi_ctx_t内嵌的struct lws_xos xos见 lws-fault-injection.h自己的 PRNG用于概率型故障决策如lws_xos_percent()的百分比判定和lws_fi_range()的区间取值。这正是测试用例 3 想验证的性质——其他故障消费fic.xos不会让random_xos前进。在 lib/core/libwebsockets.c 的lws_fi_random_seed()中void lws_fi_random_seed(struct lws_context *cx, uint64_t seed) { if (!cx-random_prng) { #if defined(LWS_WITH_NETWORK) LWS_MAX_SMP 1 pthread_mutex_init(cx-random_lock, NULL); #endif cx-random_prng 1; } lws_xos_init(cx-random_xos, seed); lwsl_cx_warn(cx, random is a seeded PRNG, NOT random: never use this for real keys); }而lws_fi_random()同文件 L248-L272以 8 字节为单位小端序填充输出缓冲区并在 SMP 构建下用random_lock保护整个流。lws_fi_random_seed()反复调用即重新播种lws_xos_init()会重置四字状态。xoshiro256** 与 splitmix64 的具体构造PRNG 算法实现在 lib/misc/prng.clws_xos_init()L68-L74用 splitmix64 把 64 位种子扩散成 4 个 64 位状态字lws_xos()L36-L52按 xoshiro256** 的标准旋转、异或移位更新状态并返回rol64(s[1] * 5, 7) * 9作为本轮结果lws_xos_percent()L76-L80用lws_xos(xos) % 100 percent实现百分比判定。因此种子 1234 的已知向量是完全确定的任何忠实重放该算法与字节序的移植实现都会在lws_fi_random_seed(cx, 1234)之后首次抽取得到同样的 16 字节。main.c 中固化了这个向量static const uint8_t vector_1234[16] { 0x6b, 0x42, 0x89, 0x9e, 0xa3, 0x63, 0xa1, 0xa3, 0x24, 0x60, 0x07, 0xbb, 0xb7, 0x67, 0x64, 0xdc, };见 main.c两种启用方式与 context 创建时序要在 context 创建伊始就使用种子流官方推荐两条路径见 README.fault-injection.md把故障名random_prng加进创建信息的 fic例如命令行--fault-injection random_prng流在 context 创建时从 fic 的 PRNG 播种即来自--fault-seed并覆盖此后 context 的一切随机抽取ws 掩码与密钥、quic connection id、multipart 边界等调用lws_fi_random_seed(context, seed)直接播种或重新播种且须在任何其他线程开始服务该 context 之前调用。对应地在 lib/core/context.c 中context 创建期间会先查询lws_fi(info-fic, random_prng)命中则用lws_xos((lws_xos_t *)info-fic.xos)抽取一个 64 位值作为种子调用lws_fi_random_seed()随后才把 fic 中所有故障导入 context 自身lws_fi_import()因此随机流从一开始就可复现。注意这两条路径都只影响 libwebsockets 自身的lws_get_random()。TLS 库在握手内部使用的自有随机源不受影响且由于这些字节完全可预测密钥生成同样经由lws_get_random()启用时会记录警告只允许在测试场景使用。命令行内置参数--fault-injection与--fault-seed是lws_cmdline_option_handle_builtin()内置的标准参数见 lib/core/libwebsockets.c。默认种子为当前微秒时间lws_now_usecs()L2190可用--fault-seed decimal覆盖解析逻辑见 L2231-L2242--fault-injection的值经lws_fi_deserialize()解析为逗号分隔的规则列表加入info-fic--fault-seed则直接改写种子。api-test-random-prng 自身并未调用该内置处理函数而是以编程方式构造 fic见下文因此两条路径在测试中都得到了覆盖。测试用例逐条剖析程序的核心辅助函数draw()main.c负责搭建 context当传入非零种子时向info.fic依次添加两条规则——random_prngLWSFI_ALWAYS与名为coin的概率故障LWSFI_PROBABILISTICpre 50即 50% 概率并用lws_xos_init(info.fic.xos, seed)为 fic 播种随后lws_create_context(info)创建 contextCONTEXT_PORT_NO_LISTEN表示不监听端口分别用lws_get_random(cx, a, len)与lws_get_random(cx, b, len)抽取两段随机字节coins参数决定在两次抽取之间调用多少次lws_fi_user_context_fi(cx, coin)来消费故障决策 PRNG。context 创建失败时还会调用lws_fi_destroy(info.fic)释放已加入的规则。接下来是 main() 中的五组断言相同种子、相同字节分别以种子 1234 调用两次draw()比较两次得到的a1/a2、b1/b2必须完全一致同时a1与b1必须不同流不能自我重复。这验证了故障random_prng从 fic 种子派生流的可复现性。不同种子、不同字节以种子 4321 调用draw()其首段a3不得与种子 1234 的a1相同证明种子真正决定了流的输出。其他故障不推动随机流以种子 1234、coins 7调用draw()即两次抽取之间插入 7 次概率故障决策每次都会消费fic.xos。结果a3/b3必须仍与用例 1 的a1/b1一致从源码层面印证random_xos与fic.xos的隔离。API 播种的已知向量创建一个不含任何故障的 context调用lws_fi_random_seed(cx, 1234)后抽取 48 字节前 16 字节必须等于vector_1234随后用同一种子再次调用lws_fi_random_seed()并重新抽取结果必须与第一次完全相同——证明重复播种会从头重启该流。失败时会用lwsl_hexdump_err()打印实际字节便于比对main.c 对应 L133-L147。未播种即平台随机以种子 0 调用draw()此时 fic 为空、context 不带故障抽取结果不得与种子流的a1相同且连续两段a3/b3也不得相同——即回落为真正的平台随机源。最后根据错误计数输出Completed: PASS或Completed: FAIL并以非零退出码标识失败。对移植实现与测试脚本的启示这套自测的核心价值在于可复现转录libwebsockets 的 sans-io 测试框架以字节转录记录运行轨迹而种子 PRNG 让任何移植例如新平台或语言重写只要忠实实现 splitmix64 播种、xoshiro256** 更新与小端序输出并在相同调用序列下调用lws_get_random()就能逐字节匹配原库的转录内容。具体要点播种必须使用 splitmix64 将种子扩散为 4 个 64 位状态字顺序不可改变每次抽取按 64 位为单位、低位字节先输出小端序随机流与故障决策流必须各自独立维护状态移植验证可复用本示例的 5 组断言尤其用例 4 的 16 字节已知向量种子 1234是最直接的基准。此外故障注入系统的完整规则语法如wsi/thefault(10%)、myfault_delay(123..456)、命名空间继承vhmyvhost/wsi/listenskt等以及全部内建故障名表可继续查阅 README.fault-injection.mdlws_fi()/lws_fi_range()/lws_fi_add()等 API 的完整契约见 include/libwebsockets/lws-fault-injection.h。小结lws-api-test-random-prng以 5 组自测断言完整覆盖了 libwebsockets 种子化随机源的两条启用路径创建信息 fic 注入与lws_fi_random_seed()API 直播、流与故障决策 PRNG 的隔离性、已知向量的移植基准以及未启用时回落平台随机源的默认行为。结合 lib/core/libwebsockets.c、lib/core/context.c 与 lib/misc/prng.c 的实现可以确认lws_get_random()的分流、context 创建时的播种时序、xoshiro256**/splitmix64 的算法细节与 SMP 下的互斥保护共同构成了这一可复现随机机制。它既是回归测试的利器也是移植验证 libwebsockets 随机语义的权威基准。赞分享后端网络通信【免费下载链接】libwebsocketscanonical libwebsockets.org networking library项目地址https://gitcode.com/gh_mirrors/li/libwebsockets点击查看免费下载相关推荐boardgame.io 随机数完全指南Random API 与确定性 PRNG 设计boardgame.io 随机数完全指南Random API 与确定性 PRNG 设计 掷骰子、洗牌、抽卡——几乎所有的回合制桌游都离不开随机性。但把随机性引游戏开发Rocket.Chat 随机数工具包 rocket.chat/random 全面解析ID 生成、熵模型与 PRNG 架构Rocket.Chat 随机数工具包 rocket.chat/random 全面解析ID 生成、熵模型与 PRNG 架构 导读 本文围绕 packages/即时通讯后端前端深入 JAX 可扩展随机数引擎jax.extend.random 模块与自定义 PRNG 实现全解析深入 JAX 可扩展随机数引擎jax.extend.random 模块与自定义 PRNG 实现全解析 jax.extend.random 是 JAX 面向扩展机器学习深度学习上一篇BilibiliDown5分钟掌握B站视频下载的完整指南下一篇Graylog2 Web Interface Timeline 组件指南构建多步骤进度时间线的实践手册创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考