模块契约WebSocket 协议底座
所有权与错误
帧、消息、Close、握手和扩展解析器只借用输入视图;成功后也不会接管输入。所有写出函数使用 调用方缓冲,并在容量不足时返回所需长度,不留下半个结构。Upgrade 结果拥有 Accept 与扩展响应, 子协议暂时借用 HTTP Header;Attach 会在消费 Header 前复制它。Inflater、Deflater 和 Stream 持有资源,必须由对应 Destroy 释放。
协议错误通过稳定的模块错误码和 xrtGetError/结构化错误链表达。输入不足不是协议错误; 只有确定违反协议、参数范围、资源上限、输出回调或压缩状态时才进入失败路径。
线程
帧、消息与扩展协商 API 为无共享状态的纯函数,可任意线程并发调用;流对象与压缩/解压上下文为单拥有者对象,绑定其所属 Worker 或创建线程。
模块边界
| 层次 | 模块 | 能力 |
|---|
| 帧 | websocket_frame | 帧头解析、帧头写出、分片 mask |
| 关闭 | websocket_close | Close code、UTF-8 reason、payload 解析与写出 |
| 消息 | websocket_message | 分片、控制帧穿插、角色规则、UTF-8 和消息上限 |
| 握手 | websocket_handshake、websocket_keygen | Key、Accept、版本、子协议和 Upgrade 字段 |
| 扩展 | websocket_extension、websocket_deflate | 扩展字段与 permessage-deflate 协商 |
| 压缩 | websocket_inflater、websocket_deflater | 有界、流式、可复用的消息压缩与解压 |
| Upgrade | websocket_upgrade、websocket_upgrade_deflate | 完整 HTTP/1.1 Upgrade 校验、字段写出和压缩协商 |
| 通信 | websocket_stream、websocket_stream_tls | TCP/TLS 接管、消息事件、背压和关闭握手 |
| 组合 | websocket_upgrade_stream | 把基础协商结果直接映射为 Stream 配置,不强制带入压缩 |
| 压缩组合 | websocket_upgrade_stream + websocket_upgrade_deflate + websocket_stream_deflate | Upgrade、Stream 与 permessage-deflate 完整链路 |
每层都可以独立裁剪。仅选择帧层不会带入 HTTP、网络、TLS 或压缩;Upgrade 层才依赖 HTTP/1; TCP Stream、TLS 适配和压缩发送分别独立启用。websocket_upgrade_stream 本身不依赖压缩,只有同时 选择 websocket_upgrade_deflate 与 websocket_stream_deflate 才启用协商后的压缩链路。任何核心组合 都不会带入 Future、协程或任务系统。
高性能收发
发送端使用 xrtWsFrameWrite 在调用方栈内存或固定小缓冲中生成最多 14 字节的帧头,随后将帧头和 payload 作为两个片段直接交给 xrtNetStreamSendRefs、TLS 写入器或调用方自己的向量发送接口。 模块不会聚合、复制或暂存完整报文。客户端 payload 必须使用 xrtWsMask 处理;该函数接受 offset, 因此可以跨任意数量的输入分片保持 mask 相位。
接收端先向 xrtWsFrameParse 提供当前可见字节。返回 XWS_FRAME_MORE 时继续累积最多 14 字节帧头; 返回 XWS_FRAME_READY 后,调用方按 PayloadSize 直接消费网络缓冲中的 payload。每个分片依次经过 xrtWsMessageFrameBegin、xrtWsMessagePayload 和 xrtWsMessageFrameEnd,正文仍借用原网络缓冲, 无需构造完整消息副本。
这种边界允许应用自行选择纯协议原语,或使用 xwsstream 完成标准事件驱动通信。更高层仍可在 同一底座上组合同步等待、Future 或协程,核心不会隐藏背压。
轻量 Stream
xrtWsStreamAttach 与 xrtWsStreamAttachTls 接管已经完成 Upgrade 的 TCP/TLS 调用方引用。 iPrefix 是已经验证但尚未消费的 HTTP Header 长度:接管时先复制协商出的子协议,再精确消费 Header,最后异步处理同一缓冲中的帧余量。失败不会部分接管传输。
接收事件按 MessageBegin、零个或多个 MessageData、MessageEnd 发布。正文视图只在当前同步 回调有效,Stream 不聚合完整消息,也不为每条连接预分配固定 8 KiB 缓冲;TCP/TLS 现有块链直接 进入帧和消息状态机。TLS 帧头跨 record 时,Stream 通过受 PlainLimit 限制的 ReadMore 路径 累积最多 14 字节的完整帧头,不会因保留一个不完整前缀而停住。
发送 API 提供 copy 和可选 ref 路径,压缩发送按需创建 Deflater。SendLimit 是 WebSocket 与 底层传输待发量的统一硬边界,达到上限返回 XNET_RESULT_AGAIN;Backpressure、Writable 和 Drain 给出恢复边沿。Ping 可自动回复,Close 保证唯一发送、超时和对端终态快照。
帧与消息契约
xwsframe 描述 FIN、RSV、opcode、mask 和 63 位 payload 长度。严格解析拒绝:
- 非最短长度编码和超过 63 位的长度;
- 保留或未允许的 opcode、RSV 位;
- 分片控制帧或超过 125 字节的控制帧;
- 不符合客户端/服务端角色的 mask;
- 输出范围重叠、地址回绕和无效配置。
xrtWsFrameConfigInit 的 Mask 默认为 XWS_MASK_ANY,只用于角色未知的协议工具和 中间层。端点直接使用帧解析器时,服务端必须改为 XWS_MASK_REQUIRED,客户端必须改为 XWS_MASK_FORBIDDEN;xwsstream 已按连接角色自动设置该策略。
xwsmessagestate 不保存完整消息,只记录协议状态。它验证 continuation 顺序、Text UTF-8、 控制帧穿插、Close payload、扩展位和解码后消息上限。Ping/Pong/Close 由返回的消息标志交给调用方处理; 核心不自动回复、不自动关闭网络流。消息状态配置默认 MaxSize = SIZE_MAX,因为这一层不聚合正文; 任何收集完整消息或持有正文的上层都必须设置符合自身内存预算的有限上限。面向不可信对端时, xrtWsMessageConfigInitSafe 以 XWS_MESSAGE_SIZE_SAFE_DEFAULT(16 MiB)作为默认 消息上限初始化配置,防止恶意超长消息耗尽内存;需要无上限流时必须显式恢复 MaxSize = SIZE_MAX。XRT stream 层已提供自己的连接级默认限制。
握手与扩展
握手函数只处理 HTTP 字段值:
- 验证或生成
Sec-WebSocket-Key; - 计算并验证
Sec-WebSocket-Accept; - 解析、检查、选择和写出子协议列表;
- 检查方法、状态、版本、Upgrade、Connection、Host 和正文约束;
- 遍历、计数和写出扩展及参数。
xrtWsUpgradeRequestCheck 和 xrtWsUpgradeResponseCheck 对完整 xhttp1head 执行角色相关校验, 包括唯一 Host、GET/101、HTTP/1.1、Key/Accept 绑定、版本 13、Connection、Upgrade、正文禁止、 子协议和扩展协商。重复字段按线路顺序处理,重复子协议和歧义响应会被拒绝。
xrtWsUpgradeRequestFields、xrtWsUpgradeResponseFields 只填充调用方字段描述符,可继续与 xrtHttp1RequestWrite、xrtHttp1ResponseWrite 组合。TCP 使用 xrtHttp1*ParseBuffer,TLS 使用 xrtHttp1*ParseTls;后者在 Header 跨 TLS record 时自动请求有界增量明文。成功后把 Head.Bytes 直接传给 Attach,Upgrade 后已经到达的帧不会丢失。
生产客户端必须通过 xrtWsKeyGenerate 使用安全随机数生成 Key;示例固定值只能用于协议测试。
permessage-deflate
协商层严格区分 offer 与 response,拒绝重复参数、非法 window bits、未知响应能力和不一致的 context takeover。xrtWsDeflateDirection 将协商结果转换为单方向运行参数。
xwsinflater 与 xwsdeflater 都是流式对象:
- 输入和输出按分片推进,不聚合整条消息;
- 输出通过回调直接进入调用方缓冲或网络发送队列;
- 解压总量受消息上限和 Inflate 上限双重约束;
- no-context-takeover 在消息边界重置字典;
xrtWsDeflaterBound 可在写入前完成容量规划;- 回调失败、OOM 或数据错误后具有明确的 reset、abort 或 destroy 路径。
RSV1 只允许出现在压缩消息的首个数据帧,continuation 不重复 RSV1,控制帧永不压缩。
扩展能力
连接对象、Writer、Future/协程桥接、重连与心跳策略、连接组和广播属于独立发布的 xws 扩展。基础 TCP/TLS 通信、关闭、背压和连接级压缩留在 XRT;xws 在这条稳定路径上提供高级抽象。
测试与示例
tests/websocket/ 覆盖固定向量、分块矩阵、属性测试、no-allocation、OOM、协议模糊测试,以及 真实 Select 回环上的 ws/wss Upgrade。集成测试会拆分 TLS Header 和一字节帧头,并验证压缩 发送、解压接收和完整 Close。examples/websocket/ 不依赖高级连接对象。
xwsopcode类型
WebSocket 标准数据帧和控制帧操作码。
| 值 | 语义 |
|---|
XWS_OPCODE_CONTINUATION | 延续帧(0x0) |
XWS_OPCODE_TEXT | 文本 |
XWS_OPCODE_BINARY | 二进制 |
XWS_OPCODE_CLOSE | 关闭帧(0x8) |
XWS_OPCODE_PING | Ping(0x9) |
XWS_OPCODE_PONG | Pong(0xA) |
typedef enum xwsopcode { XWS_OPCODE_CONTINUATION = 0x0, XWS_OPCODE_TEXT = 0x1, XWS_OPCODE_BINARY = 0x2, XWS_OPCODE_CLOSE = 0x8, XWS_OPCODE_PING = 0x9, XWS_OPCODE_PONG = 0xA } xwsopcode;
xwsframeflag类型
帧标志使用逻辑位,调用方不需要了解线路字节布局。
| 值 | 语义 |
|---|
XWS_FRAME_FIN | 最终分片 |
XWS_FRAME_MASKED | 已掩码 |
XWS_FRAME_RSV1 | RSV1(压缩) |
XWS_FRAME_RSV2 | RSV2(保留) |
XWS_FRAME_RSV3 | RSV3(保留) |
typedef enum xwsframeflag { XWS_FRAME_FIN = UINT32_C(0x00000001), XWS_FRAME_MASKED = UINT32_C(0x00000002), XWS_FRAME_RSV1 = UINT32_C(0x00000004), XWS_FRAME_RSV2 = UINT32_C(0x00000008), XWS_FRAME_RSV3 = UINT32_C(0x00000010)
xwsmaskpolicy类型
接收方向使用角色对应的掩码策略,ANY 仅适合协议工具和中间层。
| 值 | 语义 |
|---|
XWS_MASK_ANY | 任意 |
XWS_MASK_REQUIRED | 必须掩码(客户端) |
XWS_MASK_FORBIDDEN | 禁止掩码(服务端) |
typedef enum xwsmaskpolicy { XWS_MASK_ANY = 0, XWS_MASK_REQUIRED, XWS_MASK_FORBIDDEN } xwsmaskpolicy;
xwsframestatus类型
帧头解析只区分协议错误、数据不足和头部就绪。
| 值 | 语义 |
|---|
XWS_FRAME_ERROR | 失败 |
XWS_FRAME_MORE | 需要更多输入 |
XWS_FRAME_READY | 已解析完整帧 |
typedef enum xwsframestatus { XWS_FRAME_ERROR = -1, XWS_FRAME_MORE = 0, XWS_FRAME_READY = 1 } xwsframestatus;
xwsframeerror类型
帧层错误码覆盖参数、扩展策略和 RFC 6455 线路约束。
| 值 | 语义 |
|---|
XWS_FRAME_ERROR_ARGUMENT | 参数非法 |
XWS_FRAME_ERROR_CONFIG | 配置非法 |
XWS_FRAME_ERROR_RSV | 失败 |
XWS_FRAME_ERROR_OPCODE | 失败 |
XWS_FRAME_ERROR_MASK | 失败 |
XWS_FRAME_ERROR_LENGTH | 失败 |
XWS_FRAME_ERROR_CONTROL | 失败 |
XWS_FRAME_ERROR_CLOSE | 失败 |
XWS_FRAME_ERROR_OUTPUT | 输出回调失败 |
typedef enum xwsframeerror { XWS_FRAME_ERROR_ARGUMENT = 1, XWS_FRAME_ERROR_CONFIG, XWS_FRAME_ERROR_RSV, XWS_FRAME_ERROR_OPCODE, XWS_FRAME_ERROR_MASK, XWS_FRAME_ERROR_LENGTH, XWS_FRAME_ERROR_CONTROL, XWS_FRAME_ERROR_CLOSE, XWS_FRAME_ERROR_OUTPUT } xwsframeerror;
xwsframeconfig类型
帧配置不持有资源;AllowedRsv 使用 XWS_FRAME_RSV* 位。 AllowedOpcodes 的第 n 位表示是否允许操作码 n。
| 字段 | 类型 | 语义 |
|---|
MaxPayload | uint64 | MaxPayload |
AllowedOpcodes | uint16 | AllowedOpcodes |
AllowedRsv | uint16 | AllowedRsv |
Mask | xwsmaskpolicy | Mask |
typedef struct xwsframeconfig { uint64 MaxPayload; uint16 AllowedOpcodes; uint16 AllowedRsv; xwsmaskpolicy Mask; } xwsframeconfig;
xwsframeerrorinfo类型
错误位置从帧头首字节开始计数。
| 字段 | 类型 | 语义 |
|---|
Code | xwsframeerror | 错误码 |
Offset | size_t | 偏移量 |
typedef struct xwsframeerrorinfo { xwsframeerror Code; size_t Offset; } xwsframeerrorinfo;
xwsframe类型
帧只描述头部和负载长度,不借用负载,也不要求负载已经到达。 HeadSize 在解析成功后有效,封包时由模块重新计算。
| 字段 | 类型 | 语义 |
|---|
Flags | uint32 | 标志位 |
Opcode | uint8 | Opcode |
PayloadSize | uint64 | PayloadSize |
HeadSize | size_t | HeadSize |
typedef struct xwsframe { uint32 Flags; uint8 Opcode; uint8 Mask[XWS_MASK_SIZE]; uint64 PayloadSize; size_t HeadSize; } xwsframe;
xwsclosecode类型
1005、1006 和 1015 只表示本地观察结果,不允许写入 Close 帧。 Code 为零由 xwsclose 专门表示线上负载没有携带状态码。
| 值 | 语义 |
|---|
XWS_CLOSE_NORMAL | 1000 正常关闭 |
XWS_CLOSE_GOING_AWAY | 1001 端点离开 |
XWS_CLOSE_PROTOCOL | 协议非法 |
XWS_CLOSE_UNSUPPORTED | 不支持 |
XWS_CLOSE_NO_STATUS | 1005 无状态码 |
XWS_CLOSE_ABNORMAL | 1006 异常关闭(无关闭帧) |
XWS_CLOSE_INVALID_DATA | 无效数据损坏 |
XWS_CLOSE_POLICY | 1008 策略违反 |
XWS_CLOSE_TOO_BIG | 1009 消息过大 |
XWS_CLOSE_EXTENSION_REQUIRED | 1010 缺少必需扩展 |
XWS_CLOSE_INTERNAL | 内部错误 |
XWS_CLOSE_RESTART | 1012 服务重启 |
XWS_CLOSE_TRY_AGAIN | TRY暂不可推进 |
XWS_CLOSE_BAD_GATEWAY | 1014 网关错误 |
XWS_CLOSE_TLS | TLS 关闭 |
typedef enum xwsclosecode { XWS_CLOSE_NORMAL = 1000, XWS_CLOSE_GOING_AWAY = 1001, XWS_CLOSE_PROTOCOL = 1002, XWS_CLOSE_UNSUPPORTED = 1003, XWS_CLOSE_NO_STATUS = 1005, XWS_CLOSE_ABNORMAL = 1006, XWS_CLOSE_INVALID_DATA = 1007, XWS_CLOSE_POLICY = 1008, XWS_CLOSE_TOO_BIG = 1009, XWS_CLOSE_EXTENSION_REQUIRED = 1010, XWS_CLOSE_INTERNAL = 1011, XWS_CLOSE_RESTART = 1012, XWS_CLOSE_TRY_AGAIN = 1013, XWS_CLOSE_BAD_GATEWAY = 1014, XWS_CLOSE_TLS = 1015 } xwsclosecode;
xwscloseerror类型
Close 负载错误区分参数、协议状态码、UTF-8、长度和输出容量。
| 值 | 语义 |
|---|
XWS_CLOSE_ERROR_ARGUMENT | 参数非法 |
XWS_CLOSE_ERROR_SIZE | 尺寸 |
XWS_CLOSE_ERROR_CODE | 失败 |
XWS_CLOSE_ERROR_UTF8 | 失败 |
XWS_CLOSE_ERROR_OUTPUT | 写出失败 |
typedef enum xwscloseerror { XWS_CLOSE_ERROR_ARGUMENT = 1, XWS_CLOSE_ERROR_SIZE, XWS_CLOSE_ERROR_CODE, XWS_CLOSE_ERROR_UTF8, XWS_CLOSE_ERROR_OUTPUT } xwscloseerror;
xwsclose类型
关闭原因直接借用原始负载;Code 为零表示负载为空。 结构不拥有内存,也不会把本地合成的 1005 写回线路。
| 字段 | 类型 | 语义 |
|---|
Code | uint16 | 错误码 |
Reason | xstrview | 原因文本 |
typedef struct xwsclose { uint16 Code; xstrview Reason; } xwsclose;
xwsmessageflag类型
消息事件标志同时描述逻辑消息边界、控制帧和扩展变换。
| 值 | 语义 |
|---|
XWS_MESSAGE_BEGIN | 纯消息 |
XWS_MESSAGE_END | 纯消息 |
XWS_MESSAGE_CONTROL | 纯消息 |
XWS_MESSAGE_EXTENDED | 纯消息 |
XWS_MESSAGE_COMPRESSED | 消息已压缩 |
typedef enum xwsmessageflag { XWS_MESSAGE_BEGIN = UINT32_C(0x00000001), XWS_MESSAGE_END = UINT32_C(0x00000002), XWS_MESSAGE_CONTROL = UINT32_C(0x00000004), XWS_MESSAGE_EXTENDED = UINT32_C(0x00000008), XWS_MESSAGE_COMPRESSED = UINT32_C(0x00000010)
xwsmessageerror类型
消息层错误可稳定映射到协议错误、非法数据或消息过大关闭码。
| 值 | 语义 |
|---|
XWS_MESSAGE_ERROR_ARGUMENT | 参数非法 |
XWS_MESSAGE_ERROR_CONFIG | 配置非法 |
XWS_MESSAGE_ERROR_STATE | 状态非法 |
XWS_MESSAGE_ERROR_OPCODE | 失败 |
XWS_MESSAGE_ERROR_FRAGMENT | 失败 |
XWS_MESSAGE_ERROR_RSV | 失败 |
XWS_MESSAGE_ERROR_PAYLOAD | 失败 |
XWS_MESSAGE_ERROR_SIZE | 尺寸 |
XWS_MESSAGE_ERROR_UTF8 | 失败 |
XWS_MESSAGE_ERROR_CLOSE | 失败即关闭 |
typedef enum xwsmessageerror { XWS_MESSAGE_ERROR_ARGUMENT = 1, XWS_MESSAGE_ERROR_CONFIG, XWS_MESSAGE_ERROR_STATE, XWS_MESSAGE_ERROR_OPCODE, XWS_MESSAGE_ERROR_FRAGMENT, XWS_MESSAGE_ERROR_RSV, XWS_MESSAGE_ERROR_PAYLOAD, XWS_MESSAGE_ERROR_SIZE, XWS_MESSAGE_ERROR_UTF8, XWS_MESSAGE_ERROR_CLOSE } xwsmessageerror;
xwsmessageconfig类型
MaxSize 限制扩展解码后的单条消息字节数;零表示只允许空消息。 三个 RSV 位图分别描述扩展允许在哪类帧上出现,默认全部禁止。
| 字段 | 类型 | 语义 |
|---|
MaxSize | size_t | MaxSize |
FirstRsv | uint16 | FirstRsv |
ContinuationRsv | uint16 | ContinuationRsv |
ControlRsv | uint16 | ControlRsv |
ValidateText | bool | ValidateText |
typedef struct xwsmessageconfig { size_t MaxSize; uint16 FirstRsv; uint16 ContinuationRsv; uint16 ControlRsv; bool ValidateText; } xwsmessageconfig;
xwsmessageinfo类型
帧开始时发布的只读语义,不借用帧对象,也不持有负载。
| 字段 | 类型 | 语义 |
|---|
Flags | uint32 | 标志位 |
Rsv | uint16 | Rsv |
Opcode | uint8 | Opcode |
FrameOpcode | uint8 | FrameOpcode |
PayloadSize | uint64 | PayloadSize |
Offset | size_t | 偏移量 |
typedef struct xwsmessageinfo { uint32 Flags; uint16 Rsv; uint8 Opcode; uint8 FrameOpcode; uint64 PayloadSize; size_t Offset; } xwsmessageinfo;
xwsmessageerrorinfo类型
可选错误详情给出消息内偏移和须回发给对端的 Close 状态码。
| 字段 | 类型 | 语义 |
|---|
Code | xwsmessageerror | 错误码 |
CloseCode | uint16 | CloseCode |
Offset | size_t | 偏移量 |
typedef struct xwsmessageerrorinfo { xwsmessageerror Code; uint16 CloseCode; size_t Offset; } xwsmessageerrorinfo;
xwsmessagestate类型
消息状态可放在连接对象内;它只保存有限状态、两个 UTF-8 校验器和 Close 状态码前缀,不缓存帧负载或完整消息。
| 字段 | 类型 | 语义 |
|---|
Config | xwsmessageconfig | 配置 |
Utf8 | xutf8state | Utf8 |
CloseUtf8 | xutf8state | CloseUtf8 |
Size | size_t | 字节数 |
FrameSize | size_t | FrameSize |
FramePayloadSize | uint64 | FramePayloadSize |
MessageRsv | uint32 | MessageRsv |
FrameRsv | uint32 | FrameRsv |
Opcode | uint8 | Opcode |
FrameOpcode | uint8 | FrameOpcode |
CloseHeadSize | uint8 | CloseHeadSize |
Fragmented | bool | Fragmented |
FrameActive | bool | FrameActive |
FrameFinal | bool | FrameFinal |
Initialized | bool | Initialized |
Failed | bool | Failed |
Closed | bool | Closed |
typedef struct xwsmessagestate { xwsmessageconfig Config; xutf8state Utf8; xutf8state CloseUtf8; size_t Size; size_t FrameSize; uint64 FramePayloadSize; uint32 MessageRsv; uint32 FrameRsv; uint8 Opcode; uint8 FrameOpcode; uint8 CloseHead[2]; uint8 CloseHeadSize; bool Fragmented; bool FrameActive; bool FrameFinal; bool Initialized; bool Failed; bool Closed; } xwsmessagestate;
xwshandshakeerror类型
握手错误码覆盖纯协议工具和后续 HTTP/1.1 Upgrade 层。
| 值 | 语义 |
|---|
XWS_HANDSHAKE_ERROR_ARGUMENT | 参数非法 |
XWS_HANDSHAKE_ERROR_KEY | 失败 |
XWS_HANDSHAKE_ERROR_ACCEPT | 失败 |
XWS_HANDSHAKE_ERROR_PROTOCOL | 协议非法 |
XWS_HANDSHAKE_ERROR_EXTENSION | 失败 |
XWS_HANDSHAKE_ERROR_METHOD | 失败 |
XWS_HANDSHAKE_ERROR_VERSION | 失败 |
XWS_HANDSHAKE_ERROR_HOST | 失败 |
XWS_HANDSHAKE_ERROR_UPGRADE | 失败 |
XWS_HANDSHAKE_ERROR_CONNECTION | 失败 |
XWS_HANDSHAKE_ERROR_BODY | 失败 |
XWS_HANDSHAKE_ERROR_STATUS | 失败 |
XWS_HANDSHAKE_ERROR_FIELD | 失败 |
XWS_HANDSHAKE_ERROR_OUTPUT | 输出失败 |
XWS_HANDSHAKE_ERROR_RANDOM | 随机源失败 |
typedef enum xwshandshakeerror { XWS_HANDSHAKE_ERROR_ARGUMENT = 1, XWS_HANDSHAKE_ERROR_KEY, XWS_HANDSHAKE_ERROR_ACCEPT, XWS_HANDSHAKE_ERROR_PROTOCOL, XWS_HANDSHAKE_ERROR_EXTENSION, XWS_HANDSHAKE_ERROR_METHOD, XWS_HANDSHAKE_ERROR_VERSION, XWS_HANDSHAKE_ERROR_HOST, XWS_HANDSHAKE_ERROR_UPGRADE, XWS_HANDSHAKE_ERROR_CONNECTION, XWS_HANDSHAKE_ERROR_BODY, XWS_HANDSHAKE_ERROR_STATUS, XWS_HANDSHAKE_ERROR_FIELD, XWS_HANDSHAKE_ERROR_OUTPUT, XWS_HANDSHAKE_ERROR_RANDOM } xwshandshakeerror;
xwsrole类型
本地端点角色同时用于协议方向、掩码规则和扩展协商。
| 值 | 语义 |
|---|
XWS_ROLE_CLIENT | XWSROLE客户端角色 |
XWS_ROLE_SERVER | 服务端角色 |
typedef enum xwsrole { XWS_ROLE_CLIENT = 0, XWS_ROLE_SERVER } xwsrole;
xwsextension类型
扩展名称和参数段都借用 Sec-WebSocket-Extensions 原字段值。 Parameters 不包含名称后的第一个分号,空视图表示没有参数。
| 字段 | 类型 | 语义 |
|---|
Name | xstrview | 名称 |
Parameters | xstrview | Parameters |
typedef struct xwsextension { xstrview Name; xstrview Parameters; } xwsextension;
xwsdeflateflag类型
标志同时表达参数是否出现,以及 offer 中 client 窗口是否省略值。
| 值 | 语义 |
|---|
XWS_DEFLATE_SERVER_NO_CONTEXT | 服务端角色NOCONTEXT |
XWS_DEFLATE_CLIENT_NO_CONTEXT | 客户端角色NOCONTEXT |
XWS_DEFLATE_SERVER_MAX_WINDOW | 服务端角色上限WINDOW |
XWS_DEFLATE_CLIENT_MAX_WINDOW | 客户端角色上限WINDOW |
XWS_DEFLATE_CLIENT_MAX_WINDOW_ANY | 接受任意窗口 |
typedef enum xwsdeflateflag { XWS_DEFLATE_SERVER_NO_CONTEXT = UINT32_C(0x00000001), XWS_DEFLATE_CLIENT_NO_CONTEXT = UINT32_C(0x00000002), XWS_DEFLATE_SERVER_MAX_WINDOW = UINT32_C(0x00000004), XWS_DEFLATE_CLIENT_MAX_WINDOW = UINT32_C(0x00000008), XWS_DEFLATE_CLIENT_MAX_WINDOW_ANY = UINT32_C(0x00000010)
xwsdeflateerror类型
permessage-deflate 错误码区分通用参数、重复项、窗口和协商响应。
| 值 | 语义 |
|---|
XWS_DEFLATE_ERROR_ARGUMENT | 参数非法 |
XWS_DEFLATE_ERROR_EXTENSION | 失败 |
XWS_DEFLATE_ERROR_PARAMETER | 失败 |
XWS_DEFLATE_ERROR_DUPLICATE | 失败 |
XWS_DEFLATE_ERROR_WINDOW | 失败 |
XWS_DEFLATE_ERROR_RESPONSE | 失败 |
XWS_DEFLATE_ERROR_OUTPUT | 输出失败 |
XWS_DEFLATE_ERROR_CONFIG | 配置非法 |
XWS_DEFLATE_ERROR_STATE | 状态非法 |
XWS_DEFLATE_ERROR_DATA | 数据损坏 |
XWS_DEFLATE_ERROR_LIMIT | 超限 |
XWS_DEFLATE_ERROR_CODEC | 压缩流损坏 |
typedef enum xwsdeflateerror { XWS_DEFLATE_ERROR_ARGUMENT = 1, XWS_DEFLATE_ERROR_EXTENSION, XWS_DEFLATE_ERROR_PARAMETER, XWS_DEFLATE_ERROR_DUPLICATE, XWS_DEFLATE_ERROR_WINDOW, XWS_DEFLATE_ERROR_RESPONSE, XWS_DEFLATE_ERROR_OUTPUT, XWS_DEFLATE_ERROR_CONFIG, XWS_DEFLATE_ERROR_STATE, XWS_DEFLATE_ERROR_DATA, XWS_DEFLATE_ERROR_LIMIT, XWS_DEFLATE_ERROR_CODEC } xwsdeflateerror;
xwsdeflate类型
配置不持有资源;Flags 表达参数是否存在。 窗口参数未出现,或 offer 的 client 窗口省略值时,对应字段保持 15。
| 字段 | 类型 | 语义 |
|---|
Flags | uint32 | 标志位 |
ServerMaxWindowBits | uint8 | ServerMaxWindowBits |
ClientMaxWindowBits | uint8 | ClientMaxWindowBits |
typedef struct xwsdeflate { uint32 Flags; uint8 ServerMaxWindowBits; uint8 ClientMaxWindowBits; } xwsdeflate;
xwsdeflatedirection类型
单向运行参数不持有资源,也不混淆客户端与服务端参数名。
| 字段 | 类型 | 语义 |
|---|
WindowBits | uint8 | WindowBits |
NoContextTakeover | bool | NoContextTakeover |
typedef struct xwsdeflatedirection { uint8 WindowBits; bool NoContextTakeover; } xwsdeflatedirection;
xwsinflaterconfig类型
OutputLimit 是每条逻辑消息的解码后上限。 Retain 只在禁用上下文接管时决定是否保留已复位的算法对象。
| 字段 | 类型 | 语义 |
|---|
OutputLimit | uint64 | OutputLimit |
WindowBits | uint8 | WindowBits |
NoContextTakeover | bool | NoContextTakeover |
Retain | bool | Retain |
typedef struct xwsinflaterconfig { uint64 OutputLimit; uint8 WindowBits; bool NoContextTakeover; bool Retain; } xwsinflaterconfig;
xwsdeflaterconfig类型
OutputLimit 是每条逻辑消息实际交付的线路负载上限;中间 Flush 尾部计入, 最终 End 尾部会被剥离。 Retain 只在禁用上下文接管时决定是否保留已复位的算法对象。
| 字段 | 类型 | 语义 |
|---|
OutputLimit | uint64 | OutputLimit |
Level | int32 | 级别 |
Strategy | xdeflatestrategy | Strategy |
WindowBits | uint8 | WindowBits |
NoContextTakeover | bool | NoContextTakeover |
Retain | bool | Retain |
typedef struct xwsdeflaterconfig { uint64 OutputLimit; int32 Level; xdeflatestrategy Strategy; uint8 WindowBits; bool NoContextTakeover; bool Retain; } xwsdeflaterconfig;
xwsinflater类型
接收变换对象按需创建底层 Inflate,不缓存线路或解码后消息。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef struct xwsinflater xwsinflater;
xwsdeflater类型
发送变换对象按需创建底层 Deflate,只额外暂存四字节同步尾部。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
typedef struct xwsdeflater xwsdeflater;
xwsoutputproc类型
WebSocket 压缩变换的输出视图只在同步回调期间有效。 回调类型;参数与返回语义见签名及各使用方 API 节。
typedef bool(*xwsoutputproc)(xbytesview Data, ptr pData)
高性能收发
xrtWsFrameConfigInit函数
初始化帧解析的默认配置与上限。
void xrtWsFrameConfigInit(xwsframeconfig* pConfig)
范例已编译验证
frame · 帧配置
xrtWsFrameConfigInit(&Config);
xrtWsFrameInit函数
把帧结构初始化为可复用状态。
void xrtWsFrameInit(xwsframe* pFrame)
范例已编译验证
frame · 初始化帧
xrtWsFrameInit(&Frame);
xrtWsFrameParse函数
从输入头部解析一个帧描述。
xwsframestatus xrtWsFrameParse(xbytesview Input, xwsframe* pFrame, const xwsframeconfig* pConfig, xwsframeerrorinfo* pError)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Input | 输入 | 借用 | 输入数据 |
pFrame | 输出 | 非空 | 接收帧 |
pConfig | 输入 | 允许空 | 帧配置 |
pError | 输出 | 允许空 | 接收错误信息 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
XWS_FRAME_READY | 已解析完整帧头 | — |
XWS_FRAME_MORE | 输入不足 | 不设错误 |
XWS_FRAME_ERROR | 帧非法或超限 | XERR_PROTOCOL / XERR_RANGE |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法XERR_RANGE — 帧长超过配置上限
范例已编译验证
frame · 解析帧
if ( xrtWsFrameParse(
Input, &Parsed, &Config, NULL
) != XWS_FRAME_READY ) {
xrtWsFrameWrite函数
把帧头按配置写入输出缓冲。
bool xrtWsFrameWrite(const xwsframe* pFrame, const xwsframeconfig* pConfig, void* pOutput, size_t iCapacity, size_t* pSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pFrame | 输入 | 非空 | 帧描述 |
pConfig | 输入 | 允许空 | 帧配置 |
pOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 非空 | 接收写出字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 容量不足,不写半个结果XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
frame · 写出帧
if ( !xrtWsFrameWrite(
&Frame, &Config, Head, sizeof(Head), &iHeadSize
) ) {
xrtWsMask函数
按偏移连续应用四字节掩码。
bool xrtWsMask(void* pData, size_t iSize, const uint8 pMask[XWS_MASK_SIZE], uint64 iOffset)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pData | 输入/输出 | 非空 | 数据 |
iSize | 输入 | — | 字节数 |
XWS_MASK_SIZE | 输入 | — | 四字节掩码 |
iOffset | 输入 | — | 流内偏移 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
frame · 掩码异或
if ( !xrtWsMask(Payload, sizeof(Payload), Mask, 0) ) {
xrtWsMessageConfigInit函数
初始化消息重组的默认配置。
void xrtWsMessageConfigInit(xwsmessageconfig* pConfig)
xrtWsMessageConfigInitSafe函数
初始化更严格上限的安全消息配置。
void xrtWsMessageConfigInitSafe(xwsmessageconfig* pConfig)
xrtWsMessageInit函数
初始化消息重组状态。
bool xrtWsMessageInit(xwsmessagestate* pState, const xwsmessageconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pState | 输出 | 非空 | 接收状态 |
pConfig | 输入 | 允许空 | 消息配置 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
extension_tour · 初始化消息
(void)xrtWsMessageInit(&MsgState, &MsgConfig);
xrtWsMessageFrameBegin函数
把帧计入消息重组状态并产出消息信息。
bool xrtWsMessageFrameBegin(xwsmessagestate* pState, const xwsframe* pFrame, xwsmessageinfo* pInfo, xwsmessageerrorinfo* pError)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pState | 输入/输出 | 非空 | 消息状态 |
pFrame | 输入 | 非空 | 帧描述 |
pInfo | 输出 | 允许空 | 接收消息信息 |
pError | 输出 | 允许空 | 接收错误信息 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL — 帧序列违反消息语义(如文本帧后接续帧)XERR_RANGE — 消息超过配置上限
范例已编译验证
message · 开始帧
if ( !xrtWsMessageFrameBegin(&State, &Frame, &Info, NULL) ||
!xrtWsMessagePayload(
&State,
(xbytesview) { First, sizeof(First) },
NULL
) ||
!xrtWsMessageFrameEnd(&State, NULL) ) {
xrtWsMessagePayload函数
把帧载荷字节数计入消息状态。
bool xrtWsMessagePayload(xwsmessagestate* pState, xbytesview Payload, xwsmessageerrorinfo* pError)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pState | 输入/输出 | 非空 | 消息状态 |
Payload | 输入 | 借用 | 帧载荷 |
pError | 输出 | 允许空 | 接收错误信息 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 消息超过配置上限
范例已编译验证
message · 计入载荷
!xrtWsMessagePayload(
&State,
(xbytesview) { First, sizeof(First) },
NULL
) ||
xrtWsMessageFrameEnd函数
结束当前帧并推进重组状态。
bool xrtWsMessageFrameEnd(xwsmessagestate* pState, xwsmessageerrorinfo* pError)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pState | 输入/输出 | 非空 | 消息状态 |
pError | 输出 | 允许空 | 接收错误信息 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL — 分片未按 FIN 结束
范例已编译验证
message · 结束帧
!xrtWsMessageFrameEnd(&State, NULL) ) {
xrtWsMessageReset函数
重置消息重组状态以便复用。
void xrtWsMessageReset(xwsmessagestate* pState)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pState | 输入/输出 | 非空 | 消息状态 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
extension_tour · 重置消息
xrtWsMessageReset(&MsgState); /* 复位后可复用于新连接 */
帧与消息契约
xrtWsKeyGenerate函数
生成 16 字节 base64 的 Sec-WebSocket-Key。
bool xrtWsKeyGenerate(char* sKey, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
sKey | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | >= 25 | 容量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 容量不足,不写半个结果XERR_IO — 系统安全随机源失败
范例已编译验证
upgrade · 生成密钥
if ( !xrtWsKeyGenerate(Key, sizeof(Key)) ||
!xrtWsUpgradeRequestFields(
XRT_STR_LITERAL("example.test"),
(xstrview) { Key, XWS_KEY_SIZE },
XRT_STR_LITERAL("chat"),
(xstrview) { 0 },
Fields,
sizeof(Fields) / sizeof(Fields[0]),
&iFieldCount
) || !xrtHttp1RequestWrite(
XRT_STR_LITERAL("GET"),
xrtWsKeyValid函数
校验 Sec-WebSocket-Key 形态。
bool xrtWsKeyValid(xstrview Key)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是合法 | — |
false | 不是合法 | — |
范例已编译验证
extension_tour · 校验密钥
if ( !xrtWsKeyValid(SV(EXAMPLE_KEY)) ||
xrtWsKeyValid(SV("short")) ||
!xrtWsAcceptValid(SV(EXAMPLE_KEY), SV(EXAMPLE_ACCEPT)) ||
xrtWsAcceptValid(SV(EXAMPLE_KEY), SV("wrong-wrong-wrong-wrong")) ||
!xrtWsCloseCodeValid(1000u) ||
!xrtWsCloseCodeValid(3000u) ||
xrtWsCloseCodeValid(999u) ||
xrtWsCloseCodeValid(1005u) ) {
xrtWsAccept函数
由密钥计算 Sec-WebSocket-Accept。
bool xrtWsAccept(xstrview Key, char* sAccept, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Key | 输入 | 借用 | 密钥文本 |
sAccept | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | >= 29 | 容量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 容量不足,不写半个结果
范例已编译验证
handshake · 计算 Accept
if ( !xrtWsAccept(
XRT_STR_LITERAL("dGhlIHNhbXBsZSBub25jZQ=="),
Accept,
sizeof(Accept)
) ) {
xrtWsAcceptValid函数
校验服务端 Accept 值与密钥匹配。
bool xrtWsAcceptValid(xstrview Key, xstrview Accept)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Key | 输入 | 借用 | 密钥文本 |
Accept | 输入 | 借用 | Accept 值 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是匹配 | — |
false | 不是匹配 | — |
范例已编译验证
extension_tour · 校验 Accept
!xrtWsAcceptValid(SV(EXAMPLE_KEY), SV(EXAMPLE_ACCEPT)) ||
xrtWsCloseCodeValid函数
判断关闭码是否在协议允许范围内。
bool xrtWsCloseCodeValid(uint16 iCode)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是合法 | — |
false | 不是合法 | — |
xrtWsCloseParse函数
解析关闭帧载荷为代码与原因。
bool xrtWsCloseParse(xbytesview Payload, xwsclose* pClose)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Payload | 输入 | 借用 | 关闭载荷 |
pClose | 输出 | 非空 | 接收关闭描述 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL — 载荷长度为 1 或代码/原因非法
范例已编译验证
close · 解析关闭帧
if ( !xrtWsCloseParse(Input, &Close) ) {
xrtWsCloseWrite函数
把代码与原因写为关闭帧载荷。
bool xrtWsCloseWrite(uint16 iCode, xstrview Reason, void* pOutput, size_t iCapacity, size_t* pSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iCode | 输入 | — | 关闭码 |
Reason | 输入 | 借用 | 原因文本 |
pOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 非空 | 接收字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 容量不足,不写半个结果XERR_PROTOCOL — 关闭码不允许携带原因
范例已编译验证
close · 写出关闭帧
if ( !xrtWsCloseWrite(
XWS_CLOSE_NORMAL,
XRT_STR_LITERAL("shutdown"),
Payload,
sizeof(Payload),
&iSize
) ) {
xrtWsProtocolNext函数
遍历逗号分隔的子协议列表。
xhttpnext xrtWsProtocolNext(xstrview Protocols, size_t* pOffset, xstrview* pProtocol)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Protocols | 输入 | 借用 | 列表文本 |
pOffset | 输入/输出 | 非空 | 偏移游标 |
pProtocol | 输出 | 非空 | 接收子协议视图 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | — |
XHTTP_NEXT_ERROR | 失败 | — |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
extension_tour · 下一子协议
while ( xrtWsProtocolNext(SV("chat, superchat"), &iOffset,
&Protocol) == XHTTP_NEXT_ITEM ) {
xrtWsProtocolSelect函数
在客户端与服务器列表交集中选择子协议。
bool xrtWsProtocolSelect(xstrview ClientProtocols, xstrview ServerProtocols, xstrview* pSelected)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
ClientProtocols | 输入 | 借用 | 客户端列表 |
ServerProtocols | 输入 | 借用 | 服务器列表 |
pSelected | 输出 | 非空 | 接收选中视图 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法- 未命中时返回
false 且不设置错误
范例已编译验证
handshake · 选择子协议
if ( !xrtWsProtocolSelect(
XRT_STR_LITERAL("chat, superchat"),
XRT_STR_LITERAL("superchat, binary"),
&Selected
) ) {
xrtWsProtocolsHas函数
判断列表是否包含指定子协议。
bool xrtWsProtocolsHas(xstrview Protocols, xstrview Protocol)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Protocols | 输入 | 借用 | 列表文本 |
Protocol | 输入 | 借用 | 子协议 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是包含 | — |
false | 不是包含 | — |
范例已编译验证
extension_tour · 包含子协议
!xrtWsProtocolsHas(SV("chat, superchat"), SV("superchat")) ||
xrtWsProtocolsValid函数
校验列表中每个子协议形态合法。
bool xrtWsProtocolsValid(xstrview Protocols)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Protocols | 输入 | 借用 | 列表文本 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是全部合法 | — |
false | 不是全部合法 | — |
范例已编译验证
extension_tour · 校验子协议列表
if ( !xrtWsProtocolsValid(SV("chat, superchat")) ||
xrtWsProtocolsValid(SV("chat,,x")) || /* 空项非法 */
!xrtWsProtocolsHas(SV("chat, superchat"), SV("superchat")) ||
xrtWsProtocolsHas(SV("chat"), SV("super")) ) {
xrtWsExtensionCount函数
统计扩展列表中的扩展个数。
bool xrtWsExtensionCount(xstrview Extensions, size_t* pCount)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Extensions | 输入 | 借用 | 扩展列表文本 |
pCount | 输出 | 非空 | 接收数量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
extension_tour · 扩展数量
if ( !xrtWsExtensionCount(SV("permessage-deflate; client_max_window_bits"),
&iSize) ||
(iSize != 1u) ||
!xrtWsExtensionWrite(SV("permessage-deflate"),
SV("client_max_window_bits=12"),
ExtText, sizeof(ExtText), &iSize) ||
(iSize == 0u) ||
(iSize >= sizeof(ExtText)) ) {
xrtWsExtensionNext函数
遍历扩展列表中的下一个扩展。
xhttpnext xrtWsExtensionNext(xstrview Extensions, size_t* pOffset, xwsextension* pExtension)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Extensions | 输入 | 借用 | 扩展列表文本 |
pOffset | 输入/输出 | 非空 | 偏移游标 |
pExtension | 输出 | 非空 | 接收扩展 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | — |
XHTTP_NEXT_ERROR | 失败 | — |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
deflate · 下一扩展
if ( xrtWsExtensionNext(
Text,
&iOffset,
&Extension
) != XHTTP_NEXT_ITEM ) {
xrtWsExtensionParamNext函数
遍历扩展的下一个参数。
xhttpnext xrtWsExtensionParamNext(const xwsextension* pExtension, size_t* pOffset, xhttpparam* pParam)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pExtension | 输入 | 非空 | 扩展 |
pOffset | 输入/输出 | 非空 | 偏移游标 |
pParam | 输出 | 非空 | 接收参数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
XHTTP_NEXT_ITEM | 已产出一项 | — |
XHTTP_NEXT_END | 遍历结束 | — |
XHTTP_NEXT_ERROR | 失败 | — |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
extension · 下一扩展参数
while ( xrtWsExtensionParamNext(
&Extension,
&iParam,
&Param
) == XHTTP_NEXT_ITEM ) {
xrtWsExtensionWrite函数
把扩展名与参数写为列表片段。
bool xrtWsExtensionWrite(xstrview Name, xstrview Parameters, void* pOutput, size_t iCapacity, size_t* pSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Name | 输入 | 借用 | 扩展名 |
Parameters | 输入 | 借用 | 参数文本 |
pOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 非空 | 接收字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 容量不足,不写半个结果XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
extension_tour · 写出扩展
!xrtWsExtensionWrite(SV("permessage-deflate"),
SV("client_max_window_bits=12"),
ExtText, sizeof(ExtText), &iSize) ||
permessage-deflate
xrtWsDeflateInit函数
初始化 permessage-deflate 参数为默认提议。
void xrtWsDeflateInit(xwsdeflate* pConfig)
xrtWsDeflateIs函数
判断扩展是否为 permessage-deflate。
bool xrtWsDeflateIs(const xwsextension* pExtension)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是否 | — |
false | 非是否 | — |
xrtWsDeflateOfferParse函数
解析客户端提议参数。
bool xrtWsDeflateOfferParse(const xwsextension* pExtension, xwsdeflate* pOffer)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pExtension | 输入 | 非空 | 扩展 |
pOffer | 输出 | 非空 | 接收提议 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
deflate · 解析提议
if ( !xrtWsDeflateOfferParse(
&Extension,
&Offer
) || !xrtWsDeflateAccept(
&Offer,
&Response
) || !xrtWsDeflateResponseWrite(
&Response,
Output,
XWS_DEFLATE_MAX_SIZE,
&iSize
xrtWsDeflateOfferWrite函数
把提议参数写为扩展列表片段。
bool xrtWsDeflateOfferWrite(const xwsdeflate* pOffer, void* pOutput, size_t iCapacity, size_t* pSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pOffer | 输入 | 非空 | 提议 |
pOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 非空 | 接收字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 容量不足,不写半个结果
范例已编译验证
extension_tour · 写出提议
if ( !xrtWsDeflateOfferWrite(&Offer, NULL, 0u, &iSize) ||
(iSize >= sizeof(OfferText)) ||
!xrtWsDeflateOfferWrite(&Offer, OfferText,
sizeof(OfferText), &iSize) ) {
xrtWsDeflateResponseParse函数
解析服务端响应参数。
bool xrtWsDeflateResponseParse(const xwsextension* pExtension, xwsdeflate* pResponse)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pExtension | 输入 | 非空 | 扩展 |
pResponse | 输出 | 非空 | 接收响应 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
extension_tour · 解析响应
if ( !xrtWsDeflateResponseParse(&RespExt, &Parsed) ||
(Parsed.ServerMaxWindowBits != 10u) ) {
xrtWsDeflateResponseWrite函数
把响应参数写为扩展列表片段。
bool xrtWsDeflateResponseWrite(const xwsdeflate* pResponse, void* pOutput, size_t iCapacity, size_t* pSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pResponse | 输入 | 非空 | 响应 |
pOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | — | 容量 |
pSize | 输出 | 非空 | 接收字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_RANGE — 容量不足,不写半个结果
范例已编译验证
deflate · 写出响应
) || !xrtWsDeflateResponseWrite(
xrtWsDeflateResponseCheck函数
校验服务端响应与客户端提议兼容。
bool xrtWsDeflateResponseCheck(const xwsdeflate* pOffer, const xwsdeflate* pResponse)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pOffer | 输入 | 非空 | 提议 |
pResponse | 输入 | 非空 | 响应 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL — 响应与提议不兼容
范例已编译验证
extension_tour · 校验响应
if ( !xrtWsDeflateResponseCheck(&Offer, &Response) ) {
xrtWsDeflateAccept函数
按提议生成兼容的服务端响应参数。
bool xrtWsDeflateAccept(const xwsdeflate* pOffer, xwsdeflate* pResponse)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pOffer | 输入 | 非空 | 提议 |
pResponse | 输出 | 非空 | 接收响应 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_UNSUPPORTED — 提议参数无法满足
范例已编译验证
deflate · 生成响应
) || !xrtWsDeflateAccept(
xrtWsDeflateDirection函数
按角色与方向推导压缩器/解压器配置参数。
bool xrtWsDeflateDirection(const xwsdeflate* pResponse, xwsrole Role, bool bSend, xwsdeflatedirection* pDirection)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pResponse | 输入 | 非空 | 协商响应 |
Role | 输入 | — | 本端角色 |
bSend | 输入 | — | 是否发送方向 |
pDirection | 输出 | 非空 | 接收方向参数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
extension_tour · 方向参数
if ( !xrtWsDeflateDirection(&Response, XWS_ROLE_SERVER, true,
&SendDir) ||
!xrtWsDeflateDirection(&Response, XWS_ROLE_SERVER, false,
&RecvDir) ||
(SendDir.WindowBits != 10u) ||
(RecvDir.WindowBits != 15u) ) {
xrtWsDeflaterConfigInit函数
初始化压缩器默认配置。
void xrtWsDeflaterConfigInit(xwsdeflaterconfig* pConfig)
范例已编译验证
deflater · 压缩器配置
xrtWsDeflaterConfigInit(&Config);
xrtWsDeflaterConfigApply函数
把协商方向参数应用到配置。
bool xrtWsDeflaterConfigApply(xwsdeflaterconfig* pConfig, const xwsdeflatedirection* pDirection)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pConfig | 输出 | 非空 | 目标配置 |
pDirection | 输入 | 非空 | 方向参数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
extension_tour · 应用方向参数
!xrtWsDeflaterConfigApply(&DeflaterConfig, &SendDir) ) {
xrtWsDeflaterCreate函数
创建 permessage-deflate 压缩器。
xwsdeflater* xrtWsDeflaterCreate(const xwsdeflaterconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pConfig | 输入 | 允许空 | 配置,空 = 默认 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 压缩器 | — |
NULL | 创建失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_MEMORY — 分配失败XERR_UNSUPPORTED — 压缩后端不可用
范例已编译验证
deflater · 创建压缩器
pDeflater = xrtWsDeflaterCreate(&Config);
xrtWsDeflaterDestroy函数
销毁压缩器及其上下文。
void xrtWsDeflaterDestroy(xwsdeflater* pDeflater)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入 | 允许空 | 空 = 空操作 |
范例已编译验证
deflater · 销毁压缩器
xrtWsDeflaterDestroy(pDeflater);
xrtWsDeflaterReset函数
按新配置重置压缩器上下文。
bool xrtWsDeflaterReset(xwsdeflater* pDeflater, const xwsdeflaterconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入/输出 | 非空 | 目标压缩器 |
pConfig | 输入 | 允许空 | 新配置,空 = 保持 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
extension_tour · 重置压缩器
!xrtWsDeflaterReset(pDeflater, &DeflaterConfig) ) {
xrtWsDeflaterBegin函数
开始一条(可压缩)消息。
bool xrtWsDeflaterBegin(xwsdeflater* pDeflater, bool bCompressed)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入/输出 | 非空 | 目标压缩器 |
bCompressed | 输入 | — | 本条是否压缩 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
deflater · 开始消息
!xrtWsDeflaterBegin(pDeflater, true) ||
xrtWsDeflaterWrite函数
把消息数据写入压缩器。
bool xrtWsDeflaterWrite(xwsdeflater* pDeflater, xbytesview Input, xwsoutputproc pOutput, ptr pData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入/输出 | 非空 | 目标压缩器 |
Input | 输入 | 借用 | 消息数据 |
pOutput | 输入 | 非空 | 输出回调 |
pData | 输入 | 任意值 | 回调数据 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_STATE — 未 BeginXERR_MEMORY — 内部缓冲扩容失败
范例已编译验证
deflater · 写入数据
!xrtWsDeflaterWrite(
pDeflater,
XRT_BYTES_LITERAL("Hello permessage-deflate"),
onCompressed,
&iSize
) ||
xrtWsDeflaterFlush函数
冲刷当前块并同步可用输出。
bool xrtWsDeflaterFlush(xwsdeflater* pDeflater, xwsoutputproc pOutput, ptr pData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入/输出 | 非空 | 目标压缩器 |
pOutput | 输入 | 非空 | 输出回调 |
pData | 输入 | 任意值 | 回调数据 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_STATE — 未 Begin
范例已编译验证
extension_tour · 冲刷
!xrtWsDeflaterFlush(pDeflater, exampleCollect, &Sink) ||
xrtWsDeflaterEnd函数
结束消息并写出尾块。
bool xrtWsDeflaterEnd(xwsdeflater* pDeflater, xwsoutputproc pOutput, ptr pData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入/输出 | 非空 | 目标压缩器 |
pOutput | 输入 | 非空 | 输出回调 |
pData | 输入 | 任意值 | 回调数据 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_STATE — 未 Begin
范例已编译验证
deflater · 结束消息
!xrtWsDeflaterEnd(
pDeflater,
onCompressed,
&iSize
) ) {
xrtWsDeflaterAbort函数
丢弃未完成消息的压缩状态。
bool xrtWsDeflaterAbort(xwsdeflater* pDeflater)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入/输出 | 非空 | 目标压缩器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
xrtWsDeflaterSize函数
返回压缩器累计输出字节数。
uint64 xrtWsDeflaterSize(const xwsdeflater* pDeflater)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pDeflater | 输入 | 非空 | 目标压缩器 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
extension_tour · 累计输出
if ( (xrtWsDeflaterSize(pDeflater) == 0u) ||
(xrtWsDeflaterSize(pDeflater) != (uint64)Sink.Size) ) {
xrtWsDeflaterBound函数
估算输入尺寸的压缩输出上界。
bool xrtWsDeflaterBound(size_t iInputSize, size_t* pOutputSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iInputSize | 输入 | — | 输入字节数 |
pOutputSize | 输出 | 非空 | 接收上界 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
xrtWsInflaterConfigInit函数
初始化解压器默认配置。
void xrtWsInflaterConfigInit(xwsinflaterconfig* pConfig)
范例已编译验证
extension_tour · 解压器配置
(void)xrtWsInflaterConfigInit(&InflaterConfig);
xrtWsInflaterConfigApply函数
把协商方向参数应用到配置。
bool xrtWsInflaterConfigApply(xwsinflaterconfig* pConfig, const xwsdeflatedirection* pDirection)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pConfig | 输出 | 非空 | 目标配置 |
pDirection | 输入 | 非空 | 方向参数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL(xrt.ws 语义) — 帧或扩展语法非法
范例已编译验证
extension_tour · 应用方向参数
if ( !xrtWsInflaterConfigApply(&InflaterConfig, &RecvDir) ||
!xrtWsDeflaterConfigApply(&DeflaterConfig, &SendDir) ) {
xrtWsInflaterCreate函数
创建 permessage-deflate 解压器。
xwsinflater* xrtWsInflaterCreate(const xwsinflaterconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pConfig | 输入 | 允许空 | 配置,空 = 默认 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 解压器 | — |
NULL | 创建失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_MEMORY — 分配失败XERR_UNSUPPORTED — 解压后端不可用
范例已编译验证
extension_tour · 创建解压器
pInflater = xrtWsInflaterCreate(&InflaterConfig);
xrtWsInflaterDestroy函数
销毁解压器及其上下文。
void xrtWsInflaterDestroy(xwsinflater* pInflater)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pInflater | 输入 | 允许空 | 空 = 空操作 |
xrtWsInflaterReset函数
按新配置重置解压器上下文。
bool xrtWsInflaterReset(xwsinflater* pInflater, const xwsinflaterconfig* pConfig)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pInflater | 输入/输出 | 非空 | 目标解压器 |
pConfig | 输入 | 允许空 | 新配置,空 = 保持 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
extension_tour · 重置解压器
if ( !xrtWsInflaterReset(pInflater, &InflaterConfig) ||
!xrtWsDeflaterReset(pDeflater, &DeflaterConfig) ) {
xrtWsInflaterBegin函数
开始一条(可能压缩)消息。
bool xrtWsInflaterBegin(xwsinflater* pInflater, bool bCompressed)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pInflater | 输入/输出 | 非空 | 目标解压器 |
bCompressed | 输入 | — | 本条是否压缩 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
inflater · 开始消息
!xrtWsInflaterBegin(pInflater, true) ||
xrtWsInflaterWrite函数
把压缩数据写入解压器。
bool xrtWsInflaterWrite(xwsinflater* pInflater, xbytesview Input, xwsoutputproc pOutput, ptr pData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pInflater | 输入/输出 | 非空 | 目标解压器 |
Input | 输入 | 借用 | 压缩数据 |
pOutput | 输入 | 非空 | 输出回调 |
pData | 输入 | 任意值 | 回调数据 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL — 压缩流损坏XERR_RANGE — 解压输出超过配置上限XERR_STATE — 未 Begin
范例已编译验证
inflater · 写入数据
!xrtWsInflaterWrite(
pInflater,
(xbytesview){ Encoded, sizeof(Encoded) },
onText,
NULL
) ||
xrtWsInflaterEnd函数
结束消息并校验尾块。
bool xrtWsInflaterEnd(xwsinflater* pInflater, xwsoutputproc pOutput, ptr pData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pInflater | 输入/输出 | 非空 | 目标解压器 |
pOutput | 输入 | 非空 | 输出回调 |
pData | 输入 | 任意值 | 回调数据 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 成功 | — |
false | 失败 | 见错误 |
错误XERR_ARGUMENT — 指针为空或参数非法XERR_PROTOCOL — 尾块不符合 permessage-deflate 约定XERR_STATE — 未 Begin
范例已编译验证
inflater · 结束消息
!xrtWsInflaterEnd(pInflater, onText, NULL) ) {
xrtWsInflaterSize函数
返回解压器累计输出字节数。
uint64 xrtWsInflaterSize(const xwsinflater* pInflater)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pInflater | 输入 | 非空 | 目标解压器 |
错误XERR_ARGUMENT — 指针为空或参数非法
范例已编译验证
extension_tour · 累计输出
if ( xrtWsInflaterSize(pInflater) != 0u ) {
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
| XWS_ACCEPT_CAPACITY | 见头文件注释 |
| XWS_ACCEPT_SIZE | 见头文件注释 |
| XWS_CLOSE_ABNORMAL | 见头文件注释 |
| XWS_CLOSE_BAD_GATEWAY | 见头文件注释 |
| XWS_CLOSE_ERROR_ARGUMENT | 见头文件注释 |
| XWS_CLOSE_ERROR_CODE | 见头文件注释 |
| XWS_CLOSE_ERROR_OUTPUT | 见头文件注释 |
| XWS_CLOSE_ERROR_SIZE | 见头文件注释 |
| XWS_CLOSE_ERROR_UTF8 | 见头文件注释 |
| XWS_CLOSE_EXTENSION_REQUIRED | 见头文件注释 |
| XWS_CLOSE_GOING_AWAY | 见头文件注释 |
| XWS_CLOSE_INTERNAL | 见头文件注释 |
| XWS_CLOSE_INVALID_DATA | 见头文件注释 |
| XWS_CLOSE_NORMAL | 见头文件注释 |
| XWS_CLOSE_NO_STATUS | 见头文件注释 |
| XWS_CLOSE_PAYLOAD_MAX | 见头文件注释 |
| XWS_CLOSE_POLICY | 见头文件注释 |
| XWS_CLOSE_PROTOCOL | 见头文件注释 |
| XWS_CLOSE_REASON_MAX | 见头文件注释 |
| XWS_CLOSE_RESTART | 见头文件注释 |
| XWS_CLOSE_TLS | 见头文件注释 |
| XWS_CLOSE_TOO_BIG | 见头文件注释 |
| XWS_CLOSE_TRY_AGAIN | 见头文件注释 |
| XWS_CLOSE_UNSUPPORTED | 见头文件注释 |
| XWS_DEFLATE_CLIENT_MAX_WINDOW | 见头文件注释 |
| XWS_DEFLATE_CLIENT_MAX_WINDOW_ANY | 见头文件注释 |
| XWS_DEFLATE_CLIENT_NO_CONTEXT | 见头文件注释 |
| XWS_DEFLATE_ERROR_ARGUMENT | 见头文件注释 |
| XWS_DEFLATE_ERROR_CODEC | 见头文件注释 |
| XWS_DEFLATE_ERROR_CONFIG | 见头文件注释 |
| XWS_DEFLATE_ERROR_DATA | 见头文件注释 |
| XWS_DEFLATE_ERROR_DUPLICATE | 见头文件注释 |
| XWS_DEFLATE_ERROR_EXTENSION | 见头文件注释 |
| XWS_DEFLATE_ERROR_LIMIT | 见头文件注释 |
| XWS_DEFLATE_ERROR_OUTPUT | 见头文件注释 |
| XWS_DEFLATE_ERROR_PARAMETER | 见头文件注释 |
| XWS_DEFLATE_ERROR_RESPONSE | 见头文件注释 |
| XWS_DEFLATE_ERROR_STATE | 见头文件注释 |
| XWS_DEFLATE_ERROR_WINDOW | 见头文件注释 |
| XWS_DEFLATE_MAX_SIZE | 见头文件注释 |
| XWS_DEFLATE_NAME | 见头文件注释 |
| XWS_DEFLATE_SERVER_MAX_WINDOW | 见头文件注释 |
| XWS_DEFLATE_SERVER_NO_CONTEXT | 见头文件注释 |
| XWS_DEFLATE_WINDOW_MAX | 见头文件注释 |
| XWS_DEFLATE_WINDOW_MIN | 见头文件注释 |
| XWS_FRAME_ERROR | 见头文件注释 |
| XWS_FRAME_ERROR_ARGUMENT | 见头文件注释 |
| XWS_FRAME_ERROR_CLOSE | 见头文件注释 |
| XWS_FRAME_ERROR_CONFIG | 见头文件注释 |
| XWS_FRAME_ERROR_CONTROL | 见头文件注释 |
| XWS_FRAME_ERROR_LENGTH | 见头文件注释 |
| XWS_FRAME_ERROR_MASK | 见头文件注释 |
| XWS_FRAME_ERROR_OPCODE | 见头文件注释 |
| XWS_FRAME_ERROR_OUTPUT | 见头文件注释 |
| XWS_FRAME_ERROR_RSV | 见头文件注释 |
| XWS_FRAME_FIN | 见头文件注释 |
| XWS_FRAME_HEAD_MAX | 见头文件注释 |
| XWS_FRAME_MASKED | 见头文件注释 |
| XWS_FRAME_MORE | 见头文件注释 |
| XWS_FRAME_PAYLOAD_MAX | 见头文件注释 |
| XWS_FRAME_READY | 见头文件注释 |
| XWS_FRAME_RSV1 | 见头文件注释 |
| XWS_FRAME_RSV2 | 见头文件注释 |
| XWS_FRAME_RSV3 | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_ACCEPT | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_ARGUMENT | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_BODY | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_CONNECTION | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_EXTENSION | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_FIELD | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_HOST | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_KEY | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_METHOD | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_OUTPUT | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_PROTOCOL | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_RANDOM | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_STATUS | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_UPGRADE | 见头文件注释 |
| XWS_HANDSHAKE_ERROR_VERSION | 见头文件注释 |
| XWS_INFLATE_OUTPUT_DEFAULT | 见头文件注释 |
| XWS_KEY_BYTES | 见头文件注释 |
| XWS_KEY_CAPACITY | 见头文件注释 |
| XWS_KEY_SIZE | 见头文件注释 |
| XWS_MASK_ANY | 见头文件注释 |
| XWS_MASK_FORBIDDEN | 见头文件注释 |
| XWS_MASK_REQUIRED | 见头文件注释 |
| XWS_MASK_SIZE | 见头文件注释 |
| XWS_MESSAGE_BEGIN | 见头文件注释 |
| XWS_MESSAGE_COMPRESSED | 见头文件注释 |
| XWS_MESSAGE_CONTROL | 见头文件注释 |
| XWS_MESSAGE_END | 见头文件注释 |
| XWS_MESSAGE_ERROR_ARGUMENT | 见头文件注释 |
| XWS_MESSAGE_ERROR_CLOSE | 见头文件注释 |
| XWS_MESSAGE_ERROR_CONFIG | 见头文件注释 |
| XWS_MESSAGE_ERROR_FRAGMENT | 见头文件注释 |
| XWS_MESSAGE_ERROR_OPCODE | 见头文件注释 |
| XWS_MESSAGE_ERROR_PAYLOAD | 见头文件注释 |
| XWS_MESSAGE_ERROR_RSV | 见头文件注释 |
| XWS_MESSAGE_ERROR_SIZE | 见头文件注释 |
| XWS_MESSAGE_ERROR_STATE | 见头文件注释 |
| XWS_MESSAGE_ERROR_UTF8 | 见头文件注释 |
| XWS_MESSAGE_EXTENDED | 见头文件注释 |
| XWS_MESSAGE_SIZE_SAFE_DEFAULT | 见头文件注释 |
| XWS_OPCODES_STANDARD | 见头文件注释 |
| XWS_OPCODE_BINARY | 见头文件注释 |
| XWS_OPCODE_CLOSE | 见头文件注释 |
| XWS_OPCODE_CONTINUATION | 见头文件注释 |
| XWS_OPCODE_PING | 见头文件注释 |
| XWS_OPCODE_PONG | 见头文件注释 |
| XWS_OPCODE_TEXT | 见头文件注释 |
| XWS_ROLE_CLIENT | 见头文件注释 |
| XWS_ROLE_SERVER | 见头文件注释 |
| XWS_VERSION | 见头文件注释 |