模块契约网络地址基础 API
错误
XERR_ARGUMENT—pAddr == NULL或Family非法
网络错误域是 xrt.net,稳定代码为:
| 代码 | 含义 |
|---|---|
XNET_ERROR_NONE | 没有网络错误;用于统计快照等非失败状态 |
XNET_ERROR_FORMAT | 数字地址或端点语法错误 |
XNET_ERROR_FAMILY | 地址族不受支持 |
XNET_ERROR_PORT | 端口为空、非十进制或越界 |
XNET_ERROR_SCOPE | IPv6 Scope 非法或越界 |
XNET_ERROR_BUFFER | 文本或 native 输出缓冲不足 |
XNET_ERROR_NATIVE | 平台地址结构截断或不支持 |
XNET_ERROR_SYSTEM | 平台网络运行时失败 |
XNET_ERROR_DNS_RESOLVE | 正向 DNS 解析失败 |
XNET_ERROR_DNS_REVERSE | 反向 DNS 解析失败 |
XNET_ERROR_DNS_RESULT | DNS 结果索引、地址族或输出非法 |
XNET_ERROR_RESOLVER_CREATE | 异步 Resolver 配置或创建失败 |
XNET_ERROR_RESOLVER_SUBMIT | Resolver 请求非法、超限或提交失败 |
XNET_ERROR_RESOLVER_CLOSED | Resolver 已关闭或关闭过程失败 |
XNET_ERROR_RESOLVER_QUERY | Resolver 后台查询失败 |
XNET_ERROR_BUFFER_STATE | 缓冲预留、池配置或修改状态非法 |
XNET_ERROR_POOL_BUSY | 缓冲池仍有实时块,不能销毁 |
XNET_ERROR_SOCKET_OPEN | 创建或初始化 Socket 失败 |
XNET_ERROR_SOCKET_CLOSE | 关闭 Socket 失败;对象仍立即失效 |
XNET_ERROR_SOCKET_OPTION | Socket 选项非法、不支持或系统操作失败 |
XNET_ERROR_SOCKET_BIND | Socket 绑定失败 |
XNET_ERROR_SOCKET_LISTEN | Socket 监听失败 |
XNET_ERROR_SOCKET_ACCEPT | 接受连接失败 |
XNET_ERROR_SOCKET_CONNECT | 发起或完成连接失败 |
XNET_ERROR_SOCKET_SHUTDOWN | 半关闭失败 |
XNET_ERROR_SOCKET_READ | Socket 接收失败 |
XNET_ERROR_SOCKET_WRITE | Socket 发送失败 |
XNET_ERROR_PORT_CREATE | 事件端口配置、后端选择或初始化失败 |
XNET_ERROR_PORT_CLOSE | 事件端口资源关闭失败 |
XNET_ERROR_PORT_WATCH | readiness 观察非法、超限或后端不支持 |
XNET_ERROR_PORT_WAIT | 事件等待参数或平台调用失败 |
XNET_ERROR_PORT_POST | 用户事件队列满、投递或唤醒失败 |
XNET_ERROR_PORT_SUBMIT | 完成式 IO 提交失败 |
XNET_ERROR_PORT_CANCEL | 完成式 IO 取消失败 |
XNET_ERROR_ENGINE_CREATE | Engine 配置、Worker 或资源创建失败 |
XNET_ERROR_ENGINE_START | Engine 启动失败 |
XNET_ERROR_ENGINE_STOP | Engine 停止或对象排空失败 |
XNET_ERROR_ENGINE_POST | Worker 命令投递失败 |
XNET_ERROR_ENGINE_TIMER | 定时器参数、容量或操作失败 |
XNET_ERROR_STREAM_CONFIG | TCP Stream 配置或 Worker 限定操作非法 |
XNET_ERROR_STREAM_CREATE | TCP Stream 创建失败 |
XNET_ERROR_STREAM_CONNECT | TCP Stream 异步连接失败 |
XNET_ERROR_STREAM_READ | TCP Stream 读取、缓冲或协议消费失败 |
XNET_ERROR_STREAM_WRITE | TCP Stream 发送或写半关闭失败 |
XNET_ERROR_STREAM_CLOSE | TCP Stream 关闭失败 |
XNET_ERROR_LISTENER_CREATE | TCP Listener 配置或创建失败 |
XNET_ERROR_LISTENER_ACCEPT | TCP Listener 接受或分发失败 |
XNET_ERROR_LISTENER_CLOSE | TCP Listener 关闭失败 |
完整示例位于 examples/network/address/main.c 和 examples/network/buffer/main.c。
设计契约
XRT_FEATURE_NET 是网络体系最底层的独立裁剪单元,只依赖 core。这一层不创建 Socket,不执行 DNS,也不依赖线程、任务或协程;它负责稳定的 IP 地址表示、数字地址与端点解析、规范输出、地址分类和平台 sockaddr 转换。
公开头文件不包含 Winsock 或 POSIX Socket 头文件。xnetaddr 因此可以直接进入 FFI 值类型、容器键、配置结构和协议对象,不会把平台 ABI 扩散到上层。Windows 网络运行时由后续 Socket 操作按需初始化,使用者不需要配对调用启动与清理函数。
Port 使用主机字节序,Address 始终使用网络字节序。IPv4 只使用前 4 字节;Scope 只对 IPv6 有意义。地址族常量是 XRT 自己的稳定值,不能与 AF_INET、AF_INET6 混用。
网络缓冲
XRT_FEATURE_NET_BUFFER 依赖 XRT_FEATURE_NET,提供 TCP、UDP、TLS、HTTP 和 WebSocket 共用的可变尺寸缓冲底座。缓冲只在实际收到或排队数据时持有块;默认池尺寸类为 512、2048、8192、32768 字节,超过最大类的请求按实际大小单独分配;默认总缓存硬上限 2 MiB 且缓存属于 Worker 而非连接——一万个空闲连接不会因此各自占用 8K。
线程:池与缓冲是线程归属对象,不在热路径加锁;同一时刻只能由所属 Worker 操作。跨线程长期保存数据时使用不绑定池的缓冲(Init 传空池)、复制到调用方内存,或让所属 Worker 执行最终释放。
所有权:四种追加形态按复制/借用/接管/自定义释放区分;Take/Ref 只有成功才转移所有权,失败时数据仍归调用方。xnetspan 只借用块内数据——任何追加、提交、消费、Pullup、Move 或 Clear 后必须重新获取。
地址列表与 DNS
数字地址语法不包含主机名解析;DNS 与不可变地址列表属于 XRT_FEATURE_NET_DNS。列表是解析结果的不可变共享快照:复制、校验、去重调用方地址后建立,Ref 增引用、Destroy 配对释放,端口统一替换用 WithPort。
网络缓冲
XRT_FEATURE_NET_BUFFER 依赖 XRT_FEATURE_NET,提供 TCP、UDP、TLS、HTTP 和 WebSocket 共用的可变尺寸缓冲底座。它保留旧版 xnetchain 的分块、Span 和引用数据优势,但删除“每个连接常驻固定 8K 缓冲”的模型。
缓冲只在实际收到或排队数据时持有块。默认池尺寸类为 512、2048、8192、32768 字节;超过最大类的请求按实际大小单独分配。默认总缓存硬上限为 2 MiB,并且缓存属于 worker,而不是连接:一万个空闲连接不会因此各自占用 8K。
Socket 原语
XRT_FEATURE_NET_SOCKET 只依赖 XRT_FEATURE_NET。这一层拥有平台 Socket 句柄,但不包含事件循环、线程、协程、隐藏收发缓冲、TCP 重连或 UDP 队列;TCP/UDP 客户端与服务器模型在它和事件端口之上组合。
错误与线程:收发族返回 xnetresult 三态(OK/AGAIN/CLOSED/ERROR),系统调用失败经 xrtGetError() 报告且保留平台错误码(XNET_ERROR_SOCKET_* 域码 + SystemCode)。Socket 无内部锁——同一 Socket 的收发应由单执行流执行;xnetsocket 是不透明指针,句柄值可为 0(视同空)。NATIVE 后缀在 Windows 上即 IOCP 兼容句柄。
网络事件端口
XRT_FEATURE_NET_PORT 依赖 Socket、单调截止时间和 Mutex,提供 backend-neutral 事件端口核心;具体后端使用独立裁剪宏。XRT_FEATURE_NET_PORT_SELECT 提供全平台 select fallback,XRT_FEATURE_NET_PORT_EPOLL 提供 Linux 原生 readiness,XRT_FEATURE_NET_PORT_KQUEUE 提供 Darwin/BSD 原生 readiness,XRT_FEATURE_NET_PORT_IOCP 提供 Windows 原生完成式 IO,XRT_FEATURE_NET_PORT_URING 提供 Linux 原生完成式 IO。readiness 与 completion 使用同一组事件、截止时间、错误和所有权口径,但不会被强迫伪装成相同执行模型。
端口由创建线程拥有:Watch、提交、取消、等待和销毁只能由拥有线程执行;查询函数以及 Post、Wake 可跨线程调用,调用方仍须保证端口对象存活。
嵌入式任务投递
xnetpost 是嵌入调用方结构的无分配任务节点:xrtNetPostInit 初始化,xrtNetPost 投递到指定 Worker 队列,出队前 xrtNetPostPending 为真。与 xrtNetEnginePost 相比它不分配节点,适合高频、固定生命周期的任务;同一 xnetpost 在出队并执行完成前不能再次投递。调用方必须通过网络对象引用保证 Worker 和 xnetpost 存活到回调返回。
网络 Engine
启用 XRT_FEATURE_NET_ENGINE 后,Engine 在事件端口之上提供固定 Worker、 有界跨线程命令、可取消 Timer 和统一 Completion 分发。它不实现 TCP、UDP、DNS 或应用协议,因此自定义传输与 XRT 高层传输可以建立在同一套运行时契约上。
标准 Engine 的平台闭包为 Windows IOCP + select、Linux epoll + select、Darwin/BSD kqueue + select、其他 POSIX 平台当前 select。Linux 的精细裁剪构建也允许 io_uring + select,不要求同时编入 epoll;此时调用方必须显式选择 XNET_PORT_URING,AUTO 仍只在已经编译的稳定默认后端中选择。显式 XNET_PORT_SELECT 可用于受限环境、诊断和后端差异回归;具体端口后端仍可脱离 Engine 独立裁剪。
名称解析(Resolver)
Resolver 提供独立于 Engine 的异步名称解析:自带工作线程池、成功/失败结果缓存与并发上限。同一规范化主机与地址族只执行一次底层查询,并发请求共享同一查询组。xrtNetResolveAsync 把查询包装为 Future。Op(xnetresolveop)是引用计数对象:回调在 Resolver Worker 上恰好执行一次,回调后仍可查询状态与结果,跨线程保留须先 xrtNetResolveOpRef。
网络接口与本机信息
接口族回答三类问题:名字与接口索引互查(InterfaceIndex/InterfaceName)、整机一致快照(Interfaces)、本机诊断偏好(LocalAddress/LocalHardware/HostName 及其文本形态)。本机诊断函数是确定性偏好查询,不代表公网出口、默认路由或服务监听策略。缓冲输出统一采用两段式:空缓冲查询所需大小,缓冲不足不写入并报告完整所需大小。
API 速览
xrtNetLookup 只解析主机,返回的所有端口均为零,适合作为缓存、连接竞速和自定义 Resolver 的底层结果。xrtNetResolve 在同一完整查询基础上写入调用方端口,适合直接建立端点;两者都返回系统顺序中的全部 IPv4/IPv6 地址并去重。
两类查询都不使用固定 64 项临时数组,也不把主机名复制到固定 256 字节字段。数字 IPv4、IPv6 和方括号 IPv6 不进入系统 DNS。Family 可以是 UNSPEC、IPV4 或 IPV6;单地址端点场景使用 xrtNetResolveOne,失败时输出保持不变。
地址列表不可变且引用计数安全。xrtNetAddrListCreate 校验、复制并按完整端点去重外部地址;xrtNetAddrListWithPort 保持地址顺序并统一端口,端口未变化时直接增加原列表引用,否则返回独立列表。Get 返回的地址只在对应列表引用存活期间有效;缓存或异步解析器可以通过 Ref 与调用方共享同一完整结果。
xrtNetReverse 使用 NI_NAMEREQD。没有 PTR 名称时明确失败,不把数字地址回退伪装成主机名。名称服务失败使用 XNET_ERROR_DNS_RESOLVE、XNET_ERROR_DNS_REVERSE 或 XNET_ERROR_DNS_RESULT,SystemCode 保存平台 getaddrinfo/getnameinfo 返回码。
完整示例位于 examples/network/dns/main.c。
分层
xrtNetLookup 是端口无关的同步 DNS 原语,结果端口全部为零。xrtNetResolve 是常见端点场景的同步便捷函数。Resolver 只执行 Lookup,因此缓存键是规范化主机名与地址族,端口不会造成重复 DNS 查询。TCP 建连时复制候选地址并写入目标端口即可。
配置
xrtNetResolverConfigInit 写入默认值:2 个 Worker、8192 个在途请求、4096 个唯一查询、256 个缓存项、60 秒成功 TTL、5 秒失败 TTL,以及 1024 字节主机名上限。
RequestLimit 限制已经受理但尚未完成回调的调用方操作。QueryLimit 限制排队和运行中的唯一底层查询;同一主机名和地址族的请求会共享查询,但仍分别占用请求限额。所有限额都是硬边界,达到边界时提交返回空指针并设置 XERR_AGAIN。
SuccessTTL 或 FailureTTL 为零时关闭对应缓存。CacheEntries 为零时完全关闭缓存。TTL 使用 xrtTimer 的单调秒刻度,不受系统时间回拨影响。
Lookup 可替换默认的 xrtNetLookup。自定义过程可能被多个 Worker 并发调用,必须线程安全;返回值必须是非空、端口为零、符合请求地址族的 xnetaddrlist,失败时必须设置结构化错误。LookupData 在 Resolver 销毁返回前必须保持有效。
查询合并与缓存
主机名按 DNS 的 ASCII 大小写规则规范化,尾随根点保留,因此 Example.COM 与 example.com 共享查询,example.com. 仍是独立的绝对名称。活动查询和缓存都使用哈希索引;缓存保存完整不可变地址列表或完整失败错误,不会退化为只缓存第一个地址。
规范化临时区按主机名长度选择栈内快速路径或受 HostLimit 约束的精确分配。唯一查询组和缓存项都把规范化主机名保存在对象尾部,不为键再建立独立堆节点;常见短主机名的缓存命中只创建调用方操作,不产生临时主机名分配。缓存内存仍由 CacheEntries、HostLimit 和两类 TTL 共同约束,不存在每个 Resolver 预留固定主机缓冲的成本。
缓存命中也不会在提交函数内直接调用用户回调。所有已受理操作的回调都在 Resolver Worker 上执行一次,避免缓存命中、取消和真实查询使用不同线程语义。回调应保持短小;需要切换到网络 Worker、任务池或 UI 线程时,应在回调中投递后续工作。
操作生命周期
操作状态依次为 PENDING、可选的 RUNNING,以及 RESOLVED、FAILED、CANCELLED 之一。终态不可改变。Result 成功时返回增加引用的完整列表;调用方使用 xrtNetAddrListDestroy 释放。Error 返回由操作引用保护的借用错误。
取消是协作式的。排队查询的最后一个订阅者取消后,底层查询不会执行;已经进入系统 getaddrinfo 的调用无法跨平台强制中断,但取消的调用方会独立进入 CANCELLED,底层查询可继续为其他订阅者或缓存生成结果。取消回调仍由 Resolver Worker 执行。
调用方可以在提交后立即释放自己的操作引用,Resolver 会持有到回调结束。回调参数是借用引用;需要在回调后继续保存时调用 xrtNetResolveOpRef。
销毁与统计
xrtNetResolverDestroy 停止接收新请求,排空所有已经受理的查询和回调,然后等待 Worker 及线程清理退出。它不能从 Resolver 自己的回调中调用;调用方必须把销毁与 Resolve、Clear、Stats 以及第二次销毁等 Resolver 所有者操作串行化。仅成功时消费创建者拥有权;失败保留原指针供重试。成功后的创建者指针不得再次传入任何 API。操作对象仍可继续保存和读取终态;内部 Resolver 外壳会由最后一个操作引用释放。自身回调可使用 xrtNetResolverTryDestroy 请求退休并取得 BUSY,由外部所有者稍后重试。
xrtNetResolverClear 清空成功与失败缓存,不影响活动查询和已经交付的共享结果。xrtNetResolverStats 返回提交、拒绝、命中、未命中、合并、底层查询、各终态以及当前队列深度的一致快照。
Future 便捷层
XRT_FEATURE_NET_RESOLVER_FUTURE 单独依赖 Resolver 与通用 Future:
成功 Future 的值是由 Future 持有的 xnetaddrlist,通过 xrtFutureValue 借用;Future 销毁时自动释放。查询失败直接保留 Resolver 操作中的结构化错误。xrtFutureCancel 会请求底层解析操作取消,最终状态由查询完成与取消之间的真实竞态决定,不会把取消请求本身伪装成已取消终态。
Future 可以使用通用同步等待、组合、延续和协程 Await API,不需要 DNS 模块重复建设另一套等待模型。
完整示例位于 examples/network/resolver/main.c 和 examples/network/resolver_future/main.c。
xnetfamily类型
地址族使用稳定值,不依赖平台 AF_INET 和 AF_INET6 常量。
| 值 | 语义 |
|---|---|
XNET_FAMILY_UNSPEC | 不指定(双栈) |
XNET_FAMILY_IPV4 | IPv4 |
XNET_FAMILY_IPV6 | IPv6 |
xnetaddr类型
端口使用主机字节序,地址字节始终使用网络字节序。
| 字段 | 类型 | 语义 |
|---|---|---|
Family | uint16 | 地址族 |
Port | uint16 | 端口 |
Scope | uint32 | 作用域标识 |
xnetresult类型
网络操作把正常控制结果与结构化错误分开表达。
| 值 | 语义 |
|---|---|
XNET_RESULT_ERROR | 失败 |
XNET_RESULT_OK | 成功 |
XNET_RESULT_AGAIN | 暂不可推进 |
XNET_RESULT_CLOSED | 已关闭 |
XNET_RESULT_TRUNCATED | 已截断 |
XNET_RESULT_TIMEOUT | 超时 |
XNET_RESULT_CANCELLED | 已取消 |
xneterror类型
网络基础层稳定错误代码。
| 值 | 语义 |
|---|---|
XNET_ERROR_NONE | 无 |
XNET_ERROR_FORMAT | 格式非法 |
XNET_ERROR_FAMILY | 失败 |
XNET_ERROR_PORT | 失败 |
XNET_ERROR_SCOPE | 失败 |
XNET_ERROR_BUFFER | 失败 |
XNET_ERROR_NATIVE | 失败 |
XNET_ERROR_SYSTEM | 失败 |
XNET_ERROR_INTERFACE_QUERY | 失败 |
XNET_ERROR_INTERFACE_NAME | INTERFACE名称 |
XNET_ERROR_INTERFACE_INDEX | INTERFACE索引 |
XNET_ERROR_INTERFACE_ADDRESS | 失败 |
XNET_ERROR_INTERFACE_HARDWARE | 失败 |
XNET_ERROR_HOST_NAME | HOST名称 |
XNET_ERROR_DNS_RESOLVE | 失败 |
XNET_ERROR_DNS_REVERSE | 失败 |
XNET_ERROR_DNS_RESULT | 失败 |
XNET_ERROR_RESOLVER_CREATE | RESOLVER创建 |
XNET_ERROR_RESOLVER_SUBMIT | 失败 |
XNET_ERROR_RESOLVER_CLOSED | RESOLVER已关闭 |
XNET_ERROR_RESOLVER_QUERY | 失败 |
XNET_ERROR_BUFFER_STATE | BUFFER状态非法 |
XNET_ERROR_POOL_BUSY | 失败 |
XNET_ERROR_FRAME_CONFIG | FRAME配置非法 |
XNET_ERROR_FRAME_STATE | FRAME状态非法 |
XNET_ERROR_FRAME_LIMIT | FRAME超限 |
XNET_ERROR_FRAME_LENGTH | 失败 |
XNET_ERROR_SOCKET_OPEN | 失败 |
XNET_ERROR_SOCKET_CLOSE | 失败 |
XNET_ERROR_SOCKET_OPTION | 失败 |
XNET_ERROR_SOCKET_BIND | 失败 |
XNET_ERROR_SOCKET_LISTEN | 失败 |
XNET_ERROR_SOCKET_ACCEPT | 失败 |
XNET_ERROR_SOCKET_CONNECT | Socket连接失败 |
XNET_ERROR_SOCKET_SHUTDOWN | 失败 |
XNET_ERROR_SOCKET_READ | SOCKET读方向 |
XNET_ERROR_SOCKET_WRITE | SOCKET写方向 |
XNET_ERROR_SOCKET_DGRAM_ERROR | SOCKETDGRAM失败 |
XNET_ERROR_PORT_CREATE | PORT创建 |
XNET_ERROR_PORT_CLOSE | 失败 |
XNET_ERROR_PORT_WATCH | 失败 |
XNET_ERROR_PORT_WAIT | 失败 |
XNET_ERROR_PORT_POST | 端口投递失败 |
XNET_ERROR_PORT_SUBMIT | 失败 |
XNET_ERROR_PORT_CANCEL | 失败 |
XNET_ERROR_ENGINE_CREATE | ENGINE创建 |
XNET_ERROR_ENGINE_START | 失败 |
XNET_ERROR_ENGINE_STOP | 失败 |
XNET_ERROR_ENGINE_POST | Engine投递失败 |
XNET_ERROR_ENGINE_TIMER | 失败 |
XNET_ERROR_STREAM_CONFIG | STREAM配置非法 |
XNET_ERROR_STREAM_CREATE | STREAM创建 |
XNET_ERROR_STREAM_CONNECT | 流连接失败 |
XNET_ERROR_STREAM_READ | STREAM读方向 |
XNET_ERROR_STREAM_WRITE | STREAM写方向 |
XNET_ERROR_STREAM_CLOSE | 失败 |
XNET_ERROR_DIAL_CONFIG | DIAL配置非法 |
XNET_ERROR_DIAL_CREATE | DIAL创建 |
XNET_ERROR_DIAL_RESOLVE | 失败 |
XNET_ERROR_DIAL_CONNECT | Dial连接失败 |
XNET_ERROR_LISTENER_CREATE | LISTENER创建 |
XNET_ERROR_LISTENER_ACCEPT | 失败 |
XNET_ERROR_LISTENER_CLOSE | 失败 |
XNET_ERROR_SERVER_CONFIG | 服务端角色配置非法 |
XNET_ERROR_SERVER_START | 服务端角色START |
XNET_ERROR_SERVER_ACCEPT | 服务端角色ACCEPT |
XNET_ERROR_UDP_CONFIG | UDP配置非法 |
XNET_ERROR_UDP_CREATE | UDP创建 |
XNET_ERROR_UDP_RECEIVE | 接收方向 |
XNET_ERROR_UDP_RECEIVE_QUEUE | 接收方向 |
XNET_ERROR_UDP_SEND | 发送方向 |
XNET_ERROR_UDP_CLOSE | 失败 |
XNET_ERROR_PROXY_CONFIG | PROXY配置非法 |
XNET_ERROR_PROXY_CREATE | PROXY创建 |
XNET_ERROR_PROXY_PROTOCOL | PROXY协议非法 |
XNET_ERROR_PROXY_AUTH | 失败 |
XNET_ERROR_PROXY_CONNECT | Proxy连接失败 |
XNET_ERROR_PROXY_LIMIT | PROXY超限 |
XNET_ERROR_PROXY_UNSUPPORTED | 代理协议不支持 |
xnetspan类型
只读 Span 借用调用方内存,不拥有数据。
| 字段 | 类型 | 语义 |
|---|---|---|
Data | cbytes | 数据 |
Size | size_t | 字节数 |
xnetwspan类型
可写 Span 借用调用方内存,不拥有数据。
| 字段 | 类型 | 语义 |
|---|---|---|
Data | bytes | 数据 |
Size | size_t | 字节数 |
xnetresolveopstate类型
解析操作只允许从等待态进入运行态,再进入一个不可变终态。
| 值 | 语义 |
|---|---|
XNET_RESOLVE_PENDING | 等待中 |
XNET_RESOLVE_RUNNING | 运行中 |
XNET_RESOLVE_RESOLVED | 已解析 |
XNET_RESOLVE_FAILED | 已失败 |
XNET_RESOLVE_CANCELLED | 已取消 |
xnetresolverconfig类型
所有限额都是硬边界;TTL 使用单调秒,零值关闭对应缓存。
| 字段 | 类型 | 语义 |
|---|---|---|
Workers | uint32 | 工作线程数 |
RequestLimit | size_t | RequestLimit |
QueryLimit | size_t | QueryLimit |
CacheEntries | size_t | CacheEntries |
SuccessTTL | uint64 | SuccessTTL |
FailureTTL | uint64 | FailureTTL |
HostLimit | size_t | HostLimit |
ThreadStack | size_t | ThreadStack |
Lookup | xnetresolverlookup | Lookup |
LookupData | ptr | LookupData |
xnetresolverstats类型
统计值在 Resolver 锁内取得一致快照,不要求调用方停止提交。
| 字段 | 类型 | 语义 |
|---|---|---|
Workers | uint32 | 工作线程数 |
Submitted | uint64 | Submitted |
Rejected | uint64 | Rejected |
CacheHits | uint64 | CacheHits |
CacheMisses | uint64 | CacheMisses |
Coalesced | uint64 | Coalesced |
QueriesStarted | uint64 | QueriesStarted |
Resolved | uint64 | Resolved |
Failed | uint64 | Failed |
Cancelled | uint64 | Cancelled |
Outstanding | size_t | Outstanding |
ActiveQueries | size_t | ActiveQueries |
QueuedQueries | size_t | QueuedQueries |
RunningQueries | size_t | RunningQueries |
ReadyCallbacks | size_t | ReadyCallbacks |
CachedResults | size_t | CachedResults |
xnetsockettype类型
Socket 类型使用稳定值,不直接暴露平台 SOCK_* 常量。
| 值 | 语义 |
|---|---|
XNET_SOCKET_STREAM | 流式(TCP) |
XNET_SOCKET_DGRAM | 数据报(UDP) |
xnetdgrammetaflag类型
数据报元数据位既用于能力、启用配置,也用于标记每个报文的有效字段。
| 值 | 语义 |
|---|---|
XNET_DGRAM_META_DESTINATION | 目的地址(辅助消息) |
XNET_DGRAM_META_INTERFACE | 到达接口索引 |
XNET_DGRAM_META_HOP_LIMIT | HOP超限 |
XNET_DGRAM_META_TRAFFIC_CLASS | 流量类别 |
XNET_DGRAM_META_SEGMENT_SIZE | SEGMENT尺寸 |
XNET_DGRAM_META_TRUNCATED | 元数据被截断 |
xnetdgrammeta类型
Destination 的端口恒为零;Flags 决定其余字段是否有效。
| 字段 | 类型 | 语义 |
|---|---|---|
Flags | uint32 | 标志位 |
Destination | xnetaddr | 目的地址 |
Interface | uint32 | Interface |
HopLimit | int | HopLimit |
TrafficClass | int | TrafficClass |
SegmentSize | uint32 | SegmentSize |
xnetdgramcontrolflag类型
逐数据报发送控制位与接收元数据分离,避免 Source 和 Destination 语义混淆。
| 值 | 语义 |
|---|---|
XNET_DGRAM_CONTROL_SOURCE | 源码位置 |
XNET_DGRAM_CONTROL_INTERFACE | 指定发送接口 |
XNET_DGRAM_CONTROL_HOP_LIMIT | HOP超限 |
XNET_DGRAM_CONTROL_TRAFFIC_CLASS | 指定流量类别 |
XNET_DGRAM_CONTROL_SEGMENT_SIZE | 指定 UDP 分段大小 |
xnetdgramcontrol类型
Source 的端口必须为零;Flags 决定本次发送覆盖哪些 Socket 默认值。
| 字段 | 类型 | 语义 |
|---|---|---|
Flags | uint32 | 标志位 |
Source | xnetaddr | 源视图 |
Interface | uint32 | Interface |
HopLimit | int | HopLimit |
TrafficClass | int | TrafficClass |
SegmentSize | uint32 | SegmentSize |
xnetdgramcap类型
数据报高级能力按当前平台和 Socket 类型查询,不能用编译平台作运行时假设。
| 值 | 语义 |
|---|---|
XNET_DGRAM_CAP_PATH_MTU_MODE | 支持路径 MTU 模式选项 |
XNET_DGRAM_CAP_PATH_MTU_QUERY | 支持路径 MTU 查询 |
XNET_DGRAM_CAP_ERROR_QUEUE | 失败QUEUE |
XNET_DGRAM_CAP_SEGMENT_SEND | 发送方向 |
XNET_DGRAM_CAP_SEGMENT_RECEIVE | 接收方向 |
xnetpmtumode类型
SYSTEM 保留平台默认;DISCOVER 禁止 IP 分片;FRAGMENT 允许分片;PROBE 忽略路径缓存。
| 值 | 语义 |
|---|---|
XNET_PMTU_SYSTEM | 沿用系统设置 |
XNET_PMTU_DISCOVER | 启用发现 |
XNET_PMTU_FRAGMENT | 禁用(允许分片) |
XNET_PMTU_PROBE | 探测模式 |
xnetdgramerrororigin类型
错误来源独立于 ICMP Type/Code,LOCAL 也可以携带路径 MTU。
| 值 | 语义 |
|---|---|
XNET_DGRAM_ERROR_UNKNOWN | 未知 |
XNET_DGRAM_ERROR_LOCAL | 失败 |
XNET_DGRAM_ERROR_ICMP | 失败 |
XNET_DGRAM_ERROR_ICMP6 | ICMPv6 错误 |
xnetdgramerrorflag类型
Flags 精确说明地址、路径 MTU 与负载截断字段是否有效。
| 值 | 语义 |
|---|---|
XNET_DGRAM_ERROR_REMOTE | 失败 |
XNET_DGRAM_ERROR_OFFENDER | 失败 |
XNET_DGRAM_ERROR_PATH_MTU | 失败 |
XNET_DGRAM_ERROR_PAYLOAD_TRUNCATED | 已截断 |
XNET_DGRAM_ERROR_META_TRUNCATED | 元数据被截断 |
xnetdgramerror类型
异步网络错误是可读取数据,不会污染当前执行上下文的错误对象。
| 字段 | 类型 | 语义 |
|---|---|---|
Flags | uint32 | 标志位 |
Origin | xnetdgramerrororigin | Origin |
Kind | xerrkind | 错误种类 |
SystemCode | int | 平台错误码 |
Type | int | 类型 |
Code | int | 错误码 |
Info | uint32 | 信息输出 |
Data | uint32 | 数据 |
PathMtu | size_t | PathMtu |
Remote | xnetaddr | Remote |
Offender | xnetaddr | Offender |
xnetdgramrecv类型
批量接收项由调用方提供缓冲,函数写入来源、可见长度和单报文结果。
| 字段 | 类型 | 语义 |
|---|---|---|
Data | void* | 数据 |
Capacity | size_t | 容量 |
Remote | xnetaddr | Remote |
Meta | xnetdgrammeta | 元数据 |
Size | size_t | 字节数 |
Result | xnetresult | 结果输出 |
xnetdgramsend类型
批量发送项在调用期间借用数据;空远端表示使用连接式 UDP 的固定 Peer。
| 字段 | 类型 | 语义 |
|---|---|---|
Remote | const xnetaddr* | Remote |
Data | const void* | 数据 |
Size | size_t | 字节数 |
xnetsocketflag类型
Socket 打开标志可以组合;系统句柄始终禁止被子进程继承。
| 值 | 语义 |
|---|---|
XNET_SOCKET_NONBLOCK | 非阻塞模式 |
xnetshutdown类型
半关闭方向与平台 SHUT_* 常量保持隔离。
| 值 | 语义 |
|---|---|
XNET_SHUTDOWN_READ | 读方向 |
XNET_SHUTDOWN_WRITE | 写方向 |
XNET_SHUTDOWN_BOTH | 双向关断 |
xnetoption类型
通用 Socket 选项以 int64 表达;负 linger 值表示关闭 linger。
| 值 | 语义 |
|---|---|
XNET_OPTION_NONBLOCK | 非阻塞模式 |
XNET_OPTION_REUSE_ADDRESS | 重用本地地址 |
XNET_OPTION_REUSE_PORT | 重用端口(负载分担) |
XNET_OPTION_EXCLUSIVE_ADDRESS | 独占地址 |
XNET_OPTION_NO_DELAY | 禁用 Nagle |
XNET_OPTION_KEEP_ALIVE | TCP 保活 |
XNET_OPTION_BROADCAST | 广播 |
XNET_OPTION_IPV6_ONLY | 仅 IPv6 |
XNET_OPTION_RECEIVE_BUFFER | 接收方向 |
XNET_OPTION_SEND_BUFFER | 发送方向 |
XNET_OPTION_LINGER | 迟滞关闭 |
XNET_OPTION_HOP_LIMIT | HOP超限 |
XNET_OPTION_TRAFFIC_CLASS | 流量类别 |
XNET_OPTION_PATH_MTU_MODE | 路径 MTU 模式 |
XNET_OPTION_PATH_MTU | 路径 MTU 探测上限 |
XNET_OPTION_DGRAM_ERRORS | ICMP 错误投递 |
XNET_OPTION_ERROR | 失败 |
xnetportbackend类型
AUTO 选择当前平台最优后端,显式值用于测试、降级和部署控制。
| 值 | 语义 |
|---|---|
XNET_PORT_AUTO | 自动 |
XNET_PORT_IOCP | Windows IOCP |
XNET_PORT_URING | Linux io_uring |
XNET_PORT_EPOLL | Linux epoll |
XNET_PORT_KQUEUE | BSD kqueue |
XNET_PORT_SELECT | select 就绪 |
xnetportcap类型
能力位明确区分完成式 IO 与 readiness,避免后端伪造同一种语义。
| 值 | 语义 |
|---|---|
XNET_PORT_CAP_READINESS | 就绪通知 |
XNET_PORT_CAP_COMPLETION | 完成通知 |
XNET_PORT_CAP_ONESHOT | 一次性注册 |
XNET_PORT_CAP_EDGE | 边缘触发 |
XNET_PORT_CAP_BATCH | 批量收割 |
XNET_PORT_CAP_WAKE | 跨线程唤醒 |
XNET_PORT_CAP_POST | POST 方法 |
XNET_PORT_CAP_CANCEL | 在途取消 |
XNET_PORT_CAP_READ_PROBE | 读方向PROBE |
XNET_PORT_CAP_DGRAM_ERROR | DGRAM失败 |
XNET_PORT_CAP_SEND_FILE | 发送方向 |
XNET_PORT_CAP_FILE_IO | 原生文件 I/O |
xnetpoll类型
readiness 关注位;错误与挂断始终隐式观察。
| 值 | 语义 |
|---|---|
XNET_POLL_READ | XNETPOLL读方向 |
XNET_POLL_WRITE | 可写 |
xnetporteventtype类型
一个事件只属于一个稳定类别,具体 readiness 状态由 Flags 组合表达。
| 值 | 语义 |
|---|---|
XNET_PORT_EVENT_READY | 就绪 |
XNET_PORT_EVENT_ACCEPT | 可接受连接 |
XNET_PORT_EVENT_CONNECT | CONNECT 方法 |
XNET_PORT_EVENT_READ_PROBE | 读方向PROBE |
XNET_PORT_EVENT_RECV | 可读 |
XNET_PORT_EVENT_SEND | 发送方向 |
XNET_PORT_EVENT_RECV_FROM | 可读(带来源) |
XNET_PORT_EVENT_RECV_MSG | 可读(带元数据) |
XNET_PORT_EVENT_RECV_ERROR | RECV失败 |
XNET_PORT_EVENT_SEND_TO | 发送方向 |
XNET_PORT_EVENT_SEND_MSG | 发送方向 |
XNET_PORT_EVENT_SEND_FILE | 发送方向 |
XNET_PORT_EVENT_FILE_READ | FILE读方向 |
XNET_PORT_EVENT_FILE_WRITE | FILE写方向 |
XNET_PORT_EVENT_USER | 用户唤醒 |
XNET_PORT_EVENT_WAKE | 用户唤醒 |
xnetporteventflag类型
事件标志表达 readiness 方向及完成式 EOF、错误等稳定状态。
| 值 | 语义 |
|---|---|
XNET_PORT_EVENT_READ | 读方向 |
XNET_PORT_EVENT_WRITE | 写方向 |
XNET_PORT_EVENT_ERROR | 失败 |
XNET_PORT_EVENT_HANGUP | 对端关闭 |
XNET_PORT_EVENT_EOF | 读到末尾 |
XNET_PORT_EVENT_MORE | 需要更多输入 |
xnetportconfig类型
配置不带版本字段;OperationCache 是每个完成操作尺寸类的缓存上限,零值关闭缓存。
| 字段 | 类型 | 语义 |
|---|---|---|
Backend | xnetportbackend | Backend |
Flags | uint32 | 标志位 |
PostLimit | size_t | PostLimit |
WatchLimit | size_t | WatchLimit |
OperationLimit | size_t | OperationLimit |
OperationCache | size_t | OperationCache |
xnetportevent类型
端口事件借用原 Socket;只有 Accepted 在接受完成时转移新对象所有权。
| 字段 | 类型 | 语义 |
|---|---|---|
Type | xnetporteventtype | 类型 |
Flags | uint32 | 标志位 |
Result | xnetresult | 结果输出 |
SystemCode | int | 平台错误码 |
Bytes | size_t | Bytes |
Id | uint64 | 标识 |
Socket | xnetsocket | Socket |
Accepted | xnetsocket | Accepted |
Address | xnetaddr | 地址 |
Meta | xnetdgrammeta | 元数据 |
DgramError | xnetdgramerror | DgramError |
User | ptr | User |
xnetenginestate类型
Engine 生命周期状态可安全地跨线程查询。
| 值 | 语义 |
|---|---|
XNET_ENGINE_STOPPED | 已停止 |
XNET_ENGINE_STARTING | 启动中 |
XNET_ENGINE_RUNNING | 运行中 |
XNET_ENGINE_STOPPING | 停止中 |
XNET_ENGINE_DESTROYING | 销毁中 |
xnetpost类型
Post 的队列节点与并发门保持不透明,允许嵌入网络对象。
| 字段 | 类型 | 语义 |
|---|---|---|
Alignment | uint64 | 对齐(二次幂) |
xnetcompletion类型
Completion 借用过程与数据,必须存活到对应端口事件回调结束。
| 字段 | 类型 | 语义 |
|---|---|---|
Proc | xnetcompletionproc | 过程指针 |
Data | ptr | 数据 |
xnetengineconfig类型
容量字段都是硬边界;CommandCapacity 会向上取整为 2 次幂。
| 字段 | 类型 | 语义 |
|---|---|---|
Backend | xnetportbackend | Backend |
Workers | uint32 | 工作线程数 |
BufferPool | const xnetbufpoolconfig* | BufferPool |
CommandCapacity | size_t | CommandCapacity |
NodeCacheBytes | size_t | NodeCacheBytes |
TimerLimit | size_t | TimerLimit |
EventBatch | size_t | EventBatch |
PortPostLimit | size_t | PortPostLimit |
PortWatchLimit | size_t | PortWatchLimit |
PortOperationLimit | size_t | PortOperationLimit |
PortOperationCache | size_t | PortOperationCache |
IdleWait | uint64 | IdleWait |
ThreadStack | size_t | ThreadStack |
xnetworkerstats类型
Worker 统计是并发快照,计数在 Engine 重启后继续累计。
| 字段 | 类型 | 语义 |
|---|---|---|
PostsAccepted | uint64 | PostsAccepted |
PostsRejected | uint64 | PostsRejected |
PostsExecuted | uint64 | PostsExecuted |
TimersAccepted | uint64 | TimersAccepted |
TimersRejected | uint64 | TimersRejected |
TimersFired | uint64 | TimersFired |
TimersCancelled | uint64 | TimersCancelled |
TimersClosed | uint64 | TimersClosed |
TimerErrors | uint64 | TimerErrors |
Events | uint64 | 事件表 |
WaitErrors | uint64 | WaitErrors |
WakeErrors | uint64 | WakeErrors |
ShutdownStalls | uint64 | ShutdownStalls |
LastWaitError | xneterror | LastWaitError |
LastWaitSystemCode | int | LastWaitSystemCode |
NodeCacheHits | uint64 | NodeCacheHits |
NodeCacheMisses | uint64 | NodeCacheMisses |
PendingCommands | size_t | PendingCommands |
ActiveTimers | size_t | ActiveTimers |
NodeCachedBytes | size_t | NodeCachedBytes |
xnetenginestats类型
Engine 统计聚合全部 Worker,并附带当前生命周期状态。
| 字段 | 类型 | 语义 |
|---|---|---|
State | xnetenginestate | 状态 |
Workers | uint32 | 工作线程数 |
PostsAccepted | uint64 | PostsAccepted |
PostsRejected | uint64 | PostsRejected |
PostsExecuted | uint64 | PostsExecuted |
TimersAccepted | uint64 | TimersAccepted |
TimersRejected | uint64 | TimersRejected |
TimersFired | uint64 | TimersFired |
TimersCancelled | uint64 | TimersCancelled |
TimersClosed | uint64 | TimersClosed |
TimerErrors | uint64 | TimerErrors |
Events | uint64 | 事件表 |
WaitErrors | uint64 | WaitErrors |
WakeErrors | uint64 | WakeErrors |
ShutdownStalls | uint64 | ShutdownStalls |
NodeCacheHits | uint64 | NodeCacheHits |
NodeCacheMisses | uint64 | NodeCacheMisses |
PendingCommands | size_t | PendingCommands |
ActiveTimers | size_t | ActiveTimers |
NodeCachedBytes | size_t | NodeCachedBytes |
LiveObjects | size_t | LiveObjects |
xnetref类型
引用 Span 在受理后转移释放责任,零长度 Span 不转移所有权。
| 字段 | 类型 | 语义 |
|---|---|---|
Data | cbytes | 数据 |
Size | size_t | 字节数 |
Release | xnetreleaseproc | Release |
Context | ptr | 回调上下文 |
xnetbufpoolinfo类型
缓冲池统计区分实时、缓存、分配、复用和动态大块。
| 字段 | 类型 | 语义 |
|---|---|---|
LiveBlocks | size_t | LiveBlocks |
LiveBytes | size_t | LiveBytes |
PeakBlocks | size_t | PeakBlocks |
PeakBytes | size_t | PeakBytes |
CachedBlocks | size_t | CachedBlocks |
CachedBytes | size_t | CachedBytes |
AllocCount | uint64 | AllocCount |
ReuseCount | uint64 | ReuseCount |
DynamicCount | uint64 | DynamicCount |
RefCount | uint64 | RefCount |
xnetbuf类型
缓冲链可栈上使用;字段用于零分配查询,调用方不得直接修改。
| 字段 | 类型 | 语义 |
|---|---|---|
Head | xnetblock* | 头指针 |
Tail | xnetblock* | 尾指针 |
Reserved | xnetblock* | 保留(必须为零) |
Pool | xnetbufpool* | Pool |
Size | size_t | 字节数 |
Blocks | size_t | Blocks |
ReservedNew | bool | ReservedNew |
xnetaddrlist类型
地址列表是不可变共享结果,解析器缓存和调用方可以独立持有引用。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetresolver类型
Resolver 与解析操作均保持不透明,解析操作可以独立于调用方引用继续执行。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetresolveop类型
解析操作对象(不透明):线程安全的可等待句柄,内含查询状态与结果地址列表。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetport类型
网络端口隐藏平台事件对象、注册表和跨线程唤醒资源。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetbufpoolconfig类型
网络缓冲池配置:按尺寸类预分配缓冲,供 xrtNetBufPool 创建共享池。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetbufpool类型
网络缓冲池(不透明):进程内共享的按类缓冲池,降低热路径分配。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetbytes类型
拥有型字节结果(不透明):一次性消费的动态缓冲,用后销毁。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetengine类型
Engine 与 Worker 对外保持不透明,所有 Worker 资源都归所属 Engine 管理。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetworker类型
网络 Worker(不透明):Engine 的执行单元,流与监听器绑定其上。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetblock类型
网络分块借用(opaque 由 net.md 正文描述):面向 Completion 的零拷贝视图单元。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xnetresolverlookup类型
自定义查询过程必须返回端口为零的不可变地址列表,并在失败时设置结构化错误。 回调类型;参数与返回语义见签名及各使用方 API 节。
xnetresolveproc类型
完成回调借用操作对象;保留到回调之后时必须显式增加引用。 回调类型;参数与返回语义见签名及各使用方 API 节。
xnettaskproc类型
Engine 任务始终在选定 Worker 上串行执行。 回调类型;参数与返回语义见签名及各使用方 API 节。
xnettimerproc类型
Timer 受理后恰好终结一次,结果区分到期、取消、停止和内部失败。 回调类型;参数与返回语义见签名及各使用方 API 节。
xnetcompletionproc类型
Engine 内的端口事件通过 Completion 回到所属 Worker。 回调类型;参数与返回语义见签名及各使用方 API 节。
xnetreleaseproc类型
外部引用的释放过程在最后一段数据离开缓冲时执行一次。 回调类型;参数与返回语义见签名及各使用方 API 节。
xrtNetAddrAny函数
构造指定族的未指定地址(IPv4 0.0.0.0 或 IPv6 ::)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输出 | 非空 | 接收构造结果 |
Family | 输入 | IPV4 或 IPV6 | 其他值失败 |
iPort | 输入 | — | 填入端口;0 合法(服务器动态端口绑定) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已构造 | — |
false | 族不合法 | 输出不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pAddr == NULL或Family非法
xrtNetAddrLoopback函数
构造指定族的回环地址(IPv4 127.0.0.1 或 IPv6 ::1)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输出 | 非空 | 接收构造结果 |
Family | 输入 | IPV4 或 IPV6 | — |
iPort | 输入 | — | 填入端口 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已构造 | — |
false | 族不合法 | 输出不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pAddr == NULL或Family非法
范例已编译验证
addr_tour · 回环以 Parse("127.0.0.1") 等价构造(见 xrtNetAddrParse 范例)
if ( !xrtNetAddrParse(&Loopback, "127.0.0.1", 8080u) ||
xrtNetAddrParse函数
严格解析数字 IPv4 或 IPv6 文本;不执行 DNS。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输出 | 非空 | 失败不修改 |
sIP | 输入 | 非空 | IPv4 四段十进制(拒绝越界/缺段/前导零歧义);IPv6 支持 ::、嵌入式 IPv4、%42 数字 Scope;启用 XRT_FEATURE_NET_INTERFACE 后还接受 %eth0 接口名 Scope |
iPort | 输入 | — | 填入端口,与文本无关 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已解析构造 | — |
false | 文本非法 | *pAddr 不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_FORMAT— 地址文本不符合严格语法
范例已编译验证
addr_tour · 双地址构造供比较族使用
if ( !xrtNetAddrParse(&Loopback, "127.0.0.1", 8080u) || !xrtNetAddrParse(&Private, "10.0.0.5", 8080u) ||
xrtNetAddrParseEndpoint函数
解析 IPv4:port、[IPv6]:port 或使用默认端口的裸地址。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输出 | 非空 | 失败不修改 |
sEndpoint | 输入 | 非空 | 裸 IPv6 的最后一段不会被猜测为端口——IPv6 显式端口必须方括号;地址按切片解析、不复制到定长临时数组 |
iDefaultPort | 输入 | — | 文本未带端口时使用;0 合法 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已解析构造 | — |
false | 文本非法 | *pAddr 不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_FORMAT— 端点语法非法
范例已编译验证
network/address · 基础范例 · 带 Scope 的 IPv6 端点
if ( !xrtNetAddrParseEndpoint(&Addr, "[fe80::1%3]:8080", 0) ) {
return 1;
}
xrtNetAddrText函数
输出规范 IP 文本,返回不含结尾零字节的所需长度。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | IPv6 按 RFC 5952:小写、去前导零、压缩第一个最长零段;IPv4 映射输出 ::ffff:192.0.2.1 |
sText | 输出 | 允许空指针 | NULL, 0 为零分配查询;容量不足仍尽量写零结尾文本 |
iCapacity | 输入 | — | 缓冲容量(含结尾零) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 所需长度 | 不含结尾零;写入成功时即实际字节数 | — |
XRT_NPOS | 地址非法 | 错误经 xrtGetError() 报告 |
XNET_ERROR_BUFFER— 容量不足(仍返回所需长度并尽量写出)XERR_ARGUMENT— 参数非法
范例已编译验证
network/interface · 基础范例 · 枚举接口地址文本
if ( xrtNetAddrText(
&pAddress->Address, sAddress, sizeof(sAddress)
) == XRT_NPOS ) {
xrtNetAddrEndpointText函数
输出带端口的规范端点文本,IPv6 始终使用方括号。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | 端口始终出现 |
sText | 输出 | 允许空指针 | 同 xrtNetAddrText 的两段式口径 |
iCapacity | 输入 | — | 缓冲容量(含结尾零) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 所需长度 | 不含结尾零 | — |
XRT_NPOS | 地址非法 | 错误经 xrtGetError() 报告 |
XNET_ERROR_BUFFER— 容量不足XERR_ARGUMENT— 参数非法
范例已编译验证
network/interface · 基础范例 · 端点输出与 AddrText 同口径(见其范例)
if ( xrtNetAddrText(
&pAddress->Address, sAddress, sizeof(sAddress)
) == XRT_NPOS ) {
xrtNetAddrString函数
分配并返回规范 IP 文本。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | — |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 拥有式零结尾文本,xrtFree 释放;可长期保存、跨函数传递、同表达式多次调用(替换旧版线程局部环形缓冲) | — |
NULL | 地址非法或分配失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 参数非法- 分配失败 — 文本内存申请失败
xrtNetAddrEndpointString函数
分配并返回带端口的规范端点文本。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | IPv6 自动加方括号 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 拥有式零结尾文本,xrtFree 释放 | — |
NULL | 地址非法或分配失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 参数非法- 分配失败 — 文本内存申请失败
范例已编译验证
network/address · 基础范例 · 端点往返
sEndpoint = xrtNetAddrEndpointString(&Addr);
if ( sEndpoint == NULL ) {
return 1;
}
xrtNetAddrEqual函数
比较完整端点:族、地址、IPv6 Scope 与端口全等。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pLeft | 输入 | 非空 | — |
pRight | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
true | 完整端点相同(端口不同即不等) |
false | 任一分量不同 |
- 无——纯谓词不设置错误
范例已编译验证
addr_tour · SameIP 分界:同 IP 换端口
if ( xrtNetAddrEqual(&Loopback, &Private) || !xrtNetAddrEqual(&Private, &Private) || xrtNetAddrEqual(&Private, &Other) ||
xrtNetAddrSameIP函数
只比较地址族、地址与 IPv6 Scope,不比较端口。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pLeft | 输入 | 非空 | — |
pRight | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
true | 同族同地址同 Scope(端口可不同) |
false | 地址分量不同 |
- 无——纯谓词不设置错误
范例已编译验证
addr_tour · 与 Equal 对照
xrtNetAddrSameIP(&Loopback, &Private) ||
!xrtNetAddrSameIP(&Private, &Other) ) {
xrtNetAddrCompare函数
为 Map、排序和稳定去重提供完整端点全序。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pLeft | 输入 | 非空 | — |
pRight | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 负数 | 左端点按序在前(比较序:族 → 地址 → Scope → 端口) |
0 | 完整端点相同 |
| 正数 | 左端点在后 |
范例已编译验证
addr_tour · 自反为零、10 < 127
if ( (xrtNetAddrCompare(&Private, &Private) != 0) || (xrtNetAddrCompare(&Private, &Loopback) >= 0) ||
xrtNetAddrIsUnspecified函数
判断地址是否为 IPv4 0.0.0.0 或 IPv6 ::。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | 只看地址,端口无关 |
| 返回 | 含义 |
|---|---|
true | 未指定地址 |
false | 其他地址 |
- 无——纯谓词不设置错误
范例已编译验证
addr_tour · Any 构造后判定
xrtNetAddrIsUnspecified(&Loopback) || !xrtNetAddrIsUnspecified(&Any) ||
xrtNetAddrIsLoopback函数
判断地址是否属于 IPv4 127/8 或 IPv6 ::1。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | IPv4 整个 127/8 段都算回环 |
| 返回 | 含义 |
|---|---|
true | 回环地址 |
false | 其他地址 |
- 无——纯谓词不设置错误
xrtNetAddrIsMulticast函数
判断地址是否属于 IPv4 224/4 或 IPv6 ff00::/8。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
true | 多播组地址 |
false | 单播地址 |
- 无——纯谓词不设置错误
范例已编译验证
addr_tour · 224.0.0.1 命中
!xrtNetAddrParse(&Other, "224.0.0.1", 0u) || !xrtNetAddrIsMulticast(&Other) ||
xrtNetAddrIsLinkLocal函数
判断地址是否属于 IPv4 169.254/16 或 IPv6 fe80::/10。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
true | 链路本地地址 |
false | 其他地址 |
- 无——纯谓词不设置错误
xrtNetAddrIsPrivate函数
判断地址是否属于 RFC 1918 IPv4 或 RFC 4193 IPv6 私有范围。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | 只含私有段——不把回环、链路本地、文档地址混入;按安全策略组合多个明确谓词 |
| 返回 | 含义 |
|---|---|
true | 私有范围地址 |
false | 公网或其他范围 |
- 无——纯谓词不设置错误
范例已编译验证
addr_tour · 192.168/10 命中、8.8.8.8 不命中
!xrtNetAddrParse(&Other, "192.168.1.1", 0u) || !xrtNetAddrIsPrivate(&Other) || !xrtNetAddrIsPrivate(&Private) ||
xrtNetAddrIsMapped函数
判断 IPv6 地址是否为 ::ffff:0:0/96 IPv4 映射地址。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | IPv4 地址恒为假 |
| 返回 | 含义 |
|---|---|
true | IPv4 映射 IPv6 |
false | 普通地址 |
- 无——纯谓词不设置错误
范例已编译验证
addr_tour · ::ffff:192.168.0.1 命中
if ( !xrtNetAddrParse(&Mapped, "::ffff:192.168.0.1", 443u) || !xrtNetAddrIsMapped(&Mapped) ||
xrtNetAddrUnmap函数
把 IPv4 映射 IPv6 地址转换为 IPv4;其他地址原样复制(保留端口)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | — |
pResult | 输出 | 非空 | 非映射地址原样复制,允许统一规范化不加分支 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出(转换或原样) | — |
false | 参数非法 | 输出不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针
范例已编译验证
addr_tour · 映射还原 + 非映射原样
!xrtNetAddrUnmap(&Mapped, &Unmapped) || !xrtNetAddrParse(&Other, "192.168.0.1", 443u) || !xrtNetAddrEqual(&Unmapped, &Other) ||
xrtNetAddrToNative函数
转换为平台 sockaddr;空输出可查询所需大小。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | — |
pNative | 输出 | 允许空指针 | NULL 时只经 *pSize 返回所需 sockaddr_in/sockaddr_in6 大小 |
pSize | 输入输出 | 非空 | 入参为容量、出参为实际大小;容量不足也会更新大小 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出(或已报告大小) | — |
false | 参数非法或容量不足 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_BUFFER— 缓冲不足(*pSize已更新为所需大小)
xrtNetAddrFromNative函数
从平台 sockaddr 转换为稳定地址结构。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输出 | 非空 | 失败不修改 |
pNative | 输入 | 非空 | 平台 sockaddr |
iSize | 输入 | — | 检查地址族与结构长度合法性 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已转换(端口与 IPv6 Scope 保留) | — |
false | 族或长度非法 | 输出不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_FAMILY— 不支持的地址族XNET_ERROR_FORMAT— 结构长度与族不符
范例已编译验证
addr_tour · sockaddr 往返等价 主机名与服务名解析属于独立 DNS 模块,不塞进地址语法函数。这组 Native 接口是有意保留的底层扩展路径:自定义 Socket 选项、第三方事件循环和上层协议可以直接连接平台 API,不需要复制 XRT 内部实现,也不会迫使公开地址结构绑定平台头文件。
!xrtNetAddrToNative(&Loopback, arrSockaddr, &iSize) ||
!xrtNetAddrFromNative(&Native, arrSockaddr, iSize) ||
!xrtNetAddrEqual(&Native, &Loopback) ) {
xrtNetBufPoolConfigInit函数
初始化默认尺寸类与有界缓存策略的池配置。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 非空 | 填入 512/2048/8192/32768 尺寸类与 2 MiB 总缓存上限 |
| 返回 | 含义 |
|---|---|
| 无 | 纯初始化;pConfig == NULL 是参数错误(经 xrtGetError() 可查) |
xrtNetBufPoolCreate函数
创建一个缓冲池;空配置使用默认值。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输入 | 允许空指针 | NULL 使用默认配置;配置内容在创建期间复制 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 新池,配对 xrtNetBufPoolDestroy() 释放 | — |
NULL | 分配失败 | 错误经 xrtGetError() 报告 |
- 分配失败 — 池结构内存申请失败
范例已编译验证
buf_tour · 默认配置建池并挂两个缓冲
if ( (pPool == NULL) ||
!xrtNetBufInit(&BufA, pPool) ||
!xrtNetBufInit(&BufB, pPool) ) {
xrtNetBufPoolDestroy函数
销毁已无实时块的池;仍有外借块时失败并保留池。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPool | 输入 | 允许空指针 | 空指针是成功空操作;块即使被 Move 到别的缓冲也仍计入原池实时统计 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 池已释放(先 Trim 清空缓存) | — |
false | 仍有实时块 | 池保持完整、块中无悬空指针;错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_POOL_BUSY—LiveBlocks != 0
xrtNetBufPoolTrim函数
把缓存裁剪到不超过指定字节数,返回真正释放的块数。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPool | 输入 | 非空 | 只释放缓存块,不影响实时数据 |
iRetainBytes | 输入 | — | 保留的缓存预算;0 清空全部缓存 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 释放块数 | 可能大于等于 0 | 参数非法时返回 0 并设置错误 |
XERR_ARGUMENT—pPool == NULL
xrtNetBufPoolGet函数
复制缓冲池当前统计,不分配内存。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPool | 输入 | 非空 | — |
pInfo | 输出 | 非空 | 实时/峰值块数与容量、缓存块数与容量、分配/复用/动态大块/外部引用计数;LiveBytes 对拥有块统计容量、对引用块统计逻辑长度 |
| 返回 | 含义 |
|---|---|
| 无 | 参数非法时不修改输出(经 xrtGetError() 可查) |
范例已编译验证
buf_tour · 空池统计全零
xrtNetBufPoolGet(pPool, &Info);
if ( (Info.LiveBlocks != 0u) ||
(Info.AllocCount != 0u) ) {
xrtNetBufInit函数
初始化空缓冲链;池为空时使用全局分配器且不缓存。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输出 | 非空 | 可栈上或嵌入连接对象;结构可继续 Clear 复用 |
pPool | 输入 | 允许空指针 | 空池适合跨线程所有权和低频独立使用 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已初始化为空链 | — |
false | 参数非法 | 结构不被触碰;错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pBuffer == NULL
xrtNetBufClear函数
释放全部块并放弃尚未提交的写入预留。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 允许空指针 | 幂等;引用块的释放过程在此时执行 |
| 返回 | 含义 |
|---|---|
| 无 | 空指针是空操作 |
范例已编译验证
buf_tour · Clear 触发 AppendRef 释放回调
xrtNetBufClear(&BufA);
xrtNetBufClear(&BufB);
if ( iReleased != 1 ) {
xrtNetBufSize函数
返回缓冲链总字节数。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 字节数 | 跨全部块的活动数据总量 |
xrtNetBufEmpty函数
返回缓冲链是否为空。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
true | 无活动数据 |
false | 至少一个字节 |
- 无——纯谓词不设置错误
xrtNetBufSpanCount函数
返回当前缓冲链的只读 Span 总数。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| Span 数 | 完整消费所需的数组容量 |
xrtNetBufSpans函数
借用最多指定数量的只读 Span。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入 | 非空 | — |
pSpans | 输出 | iCapacity > 0 时非空 | 接收 Span 数组;Span 借用块内数据 |
iCapacity | 输入 | — | 数组容量;完整数量由 SpanCount 查询 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 实际写入数 | <= iCapacity | 参数非法时返回 0 并设置错误 |
XERR_ARGUMENT—pBuffer == NULL或iCapacity > 0 && pSpans == NULL
范例已编译验证
buf_tour · 首段恰 "hello" 5 字节
(xrtNetBufSpans(&BufA, Spans, 8u) != iSpans) || (Spans[0].Size != 5u) ||
xrtNetBufFront函数
借用明文队列的第一个连续 Span;空缓冲返回假。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入 | 非空 | — |
pSpan | 输出 | 非空 | 空缓冲时被清为 { NULL, 0 } |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 首段非空 | — |
false | 缓冲为空或参数非法 | 空缓冲属正常路径不设错;参数非法设置错误 |
XERR_ARGUMENT— 空指针
范例已编译验证
network/buffer · 基础范例 · Reserve→Commit 后取首段
if ( !xrtNetBufCommit(&Buffer, 6) ||
!xrtNetBufFront(&Buffer, &Read) ) {
xrtNetBufAppend函数
复制一段数据到链尾;整个追加失败原子。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | 成功后 Size += iSize |
pData | 输入 | iSize > 0 时非空 | 来源借用调用期间 |
iSize | 输入 | — | 字节数;0 为成功空操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已复制追加 | — |
false | 参数非法或分配失败 | 原数据不变(OOM 不留部分数据);错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针- 溢出/分配失败 — 容量或总长字节数溢出、块分配失败
范例已编译验证
buf_tour · 四类追加的第一段
if ( !xrtNetBufAppend(&BufA, "hello", 5u) ||
!xrtNetBufAppendBorrow(&BufA, arrBorrow, 2u) ) {
xrtNetBufAppendBorrow函数
追加借用数据;调用方保证数据存活到该段被消费或清除。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | — |
pData | 输入 | iSize > 0 时非空 | 借用——不复制,存活期由调用方保证 |
iSize | 输入 | — | 字节数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已借用追加(零复制) | — |
false | 参数非法或登记失败 | 原数据不变;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针- 溢出 — 总长溢出
xrtNetBufAppendTake函数
接管由 xrtMalloc 家族分配的数据;成功后由缓冲最终 xrtFree。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | — |
pData | 输入 | iSize > 0 时非空 | 接管——必须来自 xrtMalloc 家族;失败时所有权仍归调用方 |
iSize | 输入 | — | 字节数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已接管追加 | — |
false | 参数非法或登记失败 | 数据仍归调用方释放;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针- 溢出 — 总长溢出
xrtNetBufAppendRef函数
接管带自定义释放过程的外部数据。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | — |
pData | 输入 | iSize > 0 时非空 | 接管;失败时不会调用释放过程 |
iSize | 输入 | — | 字节数 |
pRelease | 输入 | 非空 | 释放过程;最后一部分离开缓冲(消费完或 Clear)时恰好执行一次 |
pContext | 输入 | — | 释放过程的用户数据 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已接管追加 | — |
false | 参数非法 | 数据与释放责任仍归调用方;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针
范例已编译验证
buf_tour · 释放回调恰好一次(Clear 时触发)
if ( !xrtNetBufAppendRef(&BufA, arrRef, 2u,
exampleRelease, (ptr)&iReleased) ) {
xrtNetBufPrepend函数
把一段数据复制到新首块;不移动已有负载块。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | 原有块和外部引用保持不动——适合加协议头 |
pData | 输入 | iSize > 0 时非空 | 头内容 |
iSize | 输入 | — | 字节数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已加首块 | — |
false | 参数非法或分配失败 | 原数据不变;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针- 溢出/分配失败 — 溢出或首块分配失败
范例已编译验证
buf_tour · 加 ">> " 前缀
if ( !xrtNetBufPrepend(&BufA, ">> ", 3u) || (xrtNetBufSize(&BufA) != 14u) ||
xrtNetBufReserve函数
预留至少指定大小的连续尾部可写区。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | 预留期间不能执行其他改变链结构的操作 |
iMinimum | 输入 | — | 最小连续字节数;IOCP/io_uring/recv/TLS 解密器可直接写入 |
pSpan | 输出 | 非空 | 可写 Span;完成后 Commit 实际字节数、Cancel 放弃 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已预留并借出可写区 | — |
false | 参数/状态非法或分配失败 | 原数据不变;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XERR_STATE+XNET_ERROR_BUFFER_STATE— 已有在途预留(重复预留)- 溢出/分配失败 — 尾块扩容失败
范例已编译验证
network/buffer · 基础范例 · 直接写入式接收
if ( (pPool == NULL) || !xrtNetBufInit(&Buffer, pPool) ||
!xrtNetBufReserve(&Buffer, 6, &Write) ) {
xrtNetBufCommit函数
提交预留空间中已经写入的字节数。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | 提交后预留结束,可再次 Reserve |
iSize | 输入 | <= 预留容量 | 实际写入字节数;0 合法(丢弃预留区) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已计入缓冲 | — |
false | 无预留、超量或溢出 | 预留仍可正确提交或取消;错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_BUFFER_STATE— 没有在途预留XERR_RANGE+XNET_ERROR_BUFFER—iSize超过预留容量- 溢出 — 总长溢出
范例已编译验证
network/buffer · 基础范例 · 写入 6 字节后提交
memcpy(Write.Data, "packet", 6); if ( !xrtNetBufCommit(&Buffer, 6) ||
xrtNetBufCancel函数
放弃当前写入预留,缓冲内容保持不变。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | EAGAIN、取消或零字节结果用本接口收尾 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 预留已放弃(新块释放、登记复原) | — |
false | 没有在途预留 | 错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_BUFFER_STATE— 无预留可放弃
范例已编译验证
buf_tour · Cancel 后总长不变
if ( !xrtNetBufReserve(&BufA, 8u, &Reserve) || !xrtNetBufCancel(&BufA) ||
xrtNetBufMove函数
把源缓冲的全部块移动到目标尾部,源恢复为空但保留池配置。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pTarget | 输入输出 | 非空 | 接收全部块;只重连块链不复制负载 |
pSource | 输出 | 非空 | 恢复为空;AGAIN 或失败时源缓冲保持不变 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已转移 | — |
false | 参数非法(如自移) | 双方不变;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针或pTarget == pSource
xrtNetBufPullup函数
确保指定长度的内存前缀连续。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | 首块足够时零复制返回,否则只复制指定前缀到首块——适合解析固定协议头 |
iSize | 输入 | <= Size | 需要连续的前缀字节数 |
pSpan | 输出 | 非空 | 连续前缀 Span;iSize == 0 输出空 Span 且成功 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 前缀已连续并借出 | — |
false | 参数/状态非法或前缀超长 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XERR_RANGE+XNET_ERROR_BUFFER—iSize超过缓冲现有数据XERR_STATE+XNET_ERROR_BUFFER_STATE— 预留期间操作- 溢出/分配失败 — 首块扩容失败
xrtNetBufPeek函数
从指定偏移复制最多给定字节;不消费。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入 | 非空 | — |
iOffset | 输入 | — | 起始偏移;遇到块边界外的引用段语义见实现(跨块复制、引用块按逻辑长度) |
pOutput | 输出 | iSize > 0 时非空 | 接收副本 |
iSize | 输入 | — | 最多复制字节数 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 实际复制数 | 从 iOffset 起的可用前缀 | 参数非法时返回 0 并设置错误 |
XERR_ARGUMENT— 空指针
xrtNetBufRead函数
复制并消费:从链首取走最多给定字节。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | 已消费部分脱离活动区 |
pOutput | 输出 | iSize > 0 时非空 | 接收副本 |
iSize | 输入 | — | 请求字节数;可用不足时短读 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 实际读取数 | 短读合法 | 参数非法时返回 0 并设置错误 |
XERR_ARGUMENT— 空指针
xrtNetBufFind函数
从指定偏移查找一个字节,未找到返回 XRT_NPOS。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入 | 非空 | 跨块查找 |
iByte | 输入 | — | 目标字节 |
iOffset | 输入 | — | 起始偏移 |
| 返回 | 含义 |
|---|---|
| 偏移 | 第一个命中位置 |
XRT_NPOS | 未命中 |
范例已编译验证
buf_tour · 命中 'w' 与未命中 'z'
(xrtNetBufFind(&BufA, 'w', 0u) != 9u) || (xrtNetBufFind(&BufA, 'z', 0u) != XRT_NPOS) ||
xrtNetBufConsume函数
消费最多给定字节的前缀。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBuffer | 输入输出 | 非空 | 不会释放仍被活动写预留借用的尾块;引用块消费到最后一段时执行释放 |
iSize | 输入 | — | 请求量;允许超过剩余数据(按剩余消费) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 实际消费量 | <= iSize 且 <= Size | 参数非法时返回 0 并设置错误 |
XERR_ARGUMENT— 空指针
xrtNetBytesRef函数
增加拥有型网络字节结果的引用并返回原指针。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBytes | 输入 | 非空 | 接收结果(如 xrtNetStreamRecv)的拥有式对象 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 原指针 | 引用已增加;每次成功须一次 xrtNetBytesDestroy 配对 | — |
NULL | 参数非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pBytes == NULL
xrtNetBytesDestroy函数
释放拥有型网络字节结果;空指针视为空操作。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBytes | 输入 | 允许空指针 | 最后一个引用释放时对象销毁 |
| 返回 | 含义 |
|---|---|
| 无 | 空指针是空操作 |
xrtNetBytesView函数
返回拥有型网络字节结果的借用视图。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pBytes | 输入 | 允许空指针 | 空指针返回空视图 |
| 返回 | 含义 |
|---|---|
| 视图 | 数据与长度的只读借用;对象销毁后失效 |
xrtNetAddrListCreate函数
复制、校验并去重调用方地址,建立不可变列表。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddresses | 输入 | iCount > 0 时非空 | 来源数组在创建期间复制;重复项去除 |
iCount | 输入 | — | 地址数;0 建空列表 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 新列表,配对 xrtNetAddrListDestroy() 释放 | — |
NULL | 参数非法或分配失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—iCount > 0 && pAddresses == NULL- 分配失败 — 列表内存申请失败
范例已编译验证
addr_tour · 双地址建表
pList = xrtNetAddrListCreate(arrTwo, 2u);
if ( (pList == NULL) ||
(xrtNetAddrListCount(pList) != 2u) ) {
xrtNetAddrListWithPort函数
复制列表并统一替换端口;端口已一致时只增加引用。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pList | 输入 | 非空 | 原列表不受影响 |
iPort | 输入 | — | 新端口 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 新列表(或原列表的引用);独立 Destroy 配对 | — |
NULL | 参数非法或分配失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pList == NULL- 分配失败 — 新列表申请失败
范例已编译验证
addr_tour · 两地址统一换 443
pPortList = xrtNetAddrListWithPort(pList, 443u); if ( (pPortList == NULL) || (xrtNetAddrListCount(pPortList) != 2u) || (xrtNetAddrListGet(pPortList, 0u)->Port != 443u) ||
xrtNetAddrListRef函数
增加不可变列表引用并返回原指针。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pList | 输入 | 非空 | 对象内容在全部引用之间只读 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 原指针 | 引用已增加;每次成功须一次 Destroy 配对 | — |
NULL | 参数非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pList == NULL
xrtNetAddrListDestroy函数
释放列表引用;空指针是空操作。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pList | 输入 | 允许空指针 | 最后一个引用释放时对象销毁 |
| 返回 | 含义 |
|---|---|
| 无 | 空指针是空操作 |
xrtNetAddrListCount函数
返回地址数量;空列表返回零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pList | 输入 | 允许空指针 | 空指针返回 0 |
| 返回 | 含义 |
|---|---|
| 数量 | 列表内地址数 |
xrtNetAddrListGet函数
返回借用地址;索引越界返回空指针并设置范围错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pList | 输入 | 非空 | — |
iIndex | 输入 | < Count | 0 基索引 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 借用地址;视图随列表最后一个引用失效 | — |
NULL | 越界或参数非法 | 错误经 xrtGetError() 报告 |
XERR_RANGE—iIndex >= CountXERR_ARGUMENT—pList == NULL
xrtNetLookup函数
解析主机的全部地址;保留系统顺序、去重、端口为零。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sHost | 输入 | 非空 | 主机名或数字地址 |
Family | 输入 | — | 限定族;UNSPEC 接受全部 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 只查询主机地址的列表(端口全零),配对 Destroy 释放 | — |
NULL | 解析失败 | 错误经 xrtGetError() 报告(XNET_ERROR_DNS_* 族) |
XERR_ARGUMENT— 空指针XNET_ERROR_DNS_RESOLVE等域名解析错误
范例已编译验证
addr_tour · localhost 本机解析不依赖外网
xnetaddrlist* pLocal = xrtNetLookup("localhost",
XNET_FAMILY_IPV4);
xrtNetResolve函数
解析主机并统一端口。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
sHost | 输入 | 非空 | — |
iPort | 输入 | — | 写入全部结果的端口 |
Family | 输入 | — | — |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 带端口的列表,配对 Destroy 释放 | — |
NULL | 解析失败 | 错误经 xrtGetError() 报告 |
- 同
xrtNetLookup
范例已编译验证
network/dns · 基础范例 · 完整列表遍历
xnetaddrlist* pList = xrtNetResolve( "localhost", 443, XNET_FAMILY_UNSPEC );
xrtNetResolveOne函数
解析并复制系统顺序中的第一个地址;单地址场景无需管理列表。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输出 | 非空 | 失败不修改 |
sHost | 输入 | 非空 | — |
iPort | 输入 | — | 写入端口 |
Family | 输入 | — | — |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已复制首地址 | — |
false | 解析失败 | *pAddr 不被修改;错误经 xrtGetError() 报告 |
- 同
xrtNetLookup
范例已编译验证
addr_tour · 端口 80 的单地址
if ( !xrtNetResolveOne(&Resolved, "localhost", 80u, XNET_FAMILY_IPV4) ||
xrtNetReverse函数
反向解析一个数字地址;成功返回调用方拥有的主机名。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pAddr | 输入 | 非空 | 只接受数字地址 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 拥有式主机名,xrtFree 释放 | — |
NULL | 反查失败或参数非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_DNS_REVERSE— 反查失败
xrtNetSocketOpen函数
打开一个流式或数据报 Socket。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Family | 输入 | IPV4 或 IPV6 | — |
Type | 输入 | STREAM 或 DGRAM | — |
iFlags | 输入 | XNET_SOCKET_NONBLOCK 或 0 | 非阻塞从创建即生效 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 成功返回的对象拥有原生句柄;配对 xrtNetSocketClose() 释放 | — |
NULL | 参数非法或系统创建失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 族/类型非法XNET_ERROR_SOCKET_OPEN(系统错误)— 平台socket()失败,保留SystemCode
范例已编译验证
socket_tour · 双 UDP 套接字
A = xrtNetSocketOpen(XNET_FAMILY_IPV4, XNET_SOCKET_DGRAM, 0u); B = xrtNetSocketOpen(XNET_FAMILY_IPV4, XNET_SOCKET_DGRAM, 0u);
xrtNetSocketClose函数
关闭原生句柄并销毁对象;即使系统关闭失败,对象也立即失效。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 允许空指针(0) | 空指针是空操作;关闭后句柄不可再用 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 系统关闭成功或对象为空 | — |
false | 系统关闭失败 | 对象仍已销毁;错误经 xrtGetError() 报告 |
XNET_ERROR_SOCKET_CLOSE(系统错误)—closesocket()失败
xrtNetSocketNative函数
返回借用的原生句柄,调用方不得自行关闭。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 句柄值 | 平台 SOCKET/fd;所有权仍在 XRT 对象 |
xrtNetSocketFamily函数
返回 Socket 创建时确定的地址族。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 族枚举 | 与 Open 传入值一致 |
xrtNetSocketType函数
返回 Socket 创建时确定的类型。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 类型枚举 | 与 Open 传入值一致 |
xrtNetSocketSet函数
设置一个通用 Socket 选项。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
Option | 输入 | 见 xnetoption 枚举 | 部分选项仅特定平台支持 |
iValue | 输入 | — | 选项值;NONBLOCK 用 0/1 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已生效 | — |
false | 参数非法、不支持或系统失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空对象或非法选项XERR_UNSUPPORTED— 平台不支持该选项XNET_ERROR_SOCKET_OPTION(系统错误)—setsockopt()失败
范例已编译验证
socket_tour · 接收缓冲与逐字节读回
!xrtNetSocketSet(A, XNET_OPTION_RECEIVE_BUFFER, 65536) || !xrtNetSocketGet(A, XNET_OPTION_RECEIVE_BUFFER, &iValue) ||
xrtNetSocketGet函数
查询一个通用 Socket 选项。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
Option | 输入 | — | — |
pValue | 输出 | 非空 | 接收选项当前值 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 参数非法、不支持或系统失败 | *pValue 不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针或非法选项XERR_UNSUPPORTED— 平台不支持XNET_ERROR_SOCKET_OPTION(系统错误)—getsockopt()失败
范例已编译验证
socket_tour · 见 xrtNetSocketSet 范例
!xrtNetSocketGet(A, XNET_OPTION_RECEIVE_BUFFER, &iValue) || (iValue <= 0) ||
xrtNetSocketAvailable函数
查询当前可立即读取的字节数;成功才修改输出。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pSize | 输出 | 非空 | 空接收队列上成功返回 0 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出可读量 | — |
false | 参数非法或系统失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_READ(系统错误)—ioctlsocket/ioctl失败
xrtNetSocketBind函数
把 Socket 绑定到本地地址;端口为零时由系统分配。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pAddress | 输入 | 非空 | 通配地址绑定全部接口;实际端口由 Local 读回 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已绑定 | — |
false | 系统失败 | 错误经 xrtGetError() 报告 |
XNET_ERROR_SOCKET_BIND(系统错误)—bind()失败(端口占用等)
范例已编译验证
socket_tour · 通配绑定后 Local 读回实际端口
!xrtNetSocketBind(A, &AddrA) || !xrtNetSocketLocal(A, &AddrA) ||
xrtNetSocketListen函数
把已绑定的流式 Socket 转为监听状态。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 必须已 Bind 且为 STREAM |
iBacklog | 输入 | > 0 | 等待连接队列长度 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已监听 | — |
false | 系统失败 | 错误经 xrtGetError() 报告 |
XNET_ERROR_SOCKET_LISTEN(系统错误)—listen()失败
xrtNetSocketAccept函数
接受一个连接;非阻塞 Socket 暂无连接时返回 AGAIN。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 监听中的流式 Socket |
pClient | 输出 | 非空 | 接受成功时获得新建 Socket(调用方拥有) |
pRemote | 输出 | 非空 | 接受成功时获得对端地址 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XNET_RESULT_OK | 操作成功 | — |
XNET_RESULT_ERROR | 失败 | — |
XNET_RESULT_AGAIN | 非阻塞暂不可推进 | — |
XNET_RESULT_CLOSED | 对象已关闭 | — |
XNET_RESULT_TRUNCATED | 结果被截断 | — |
XNET_RESULT_TIMEOUT | 期限先到期 | — |
XNET_RESULT_CANCELLED | 被取消 | — |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_ACCEPT(系统错误)—accept()失败
范例已编译验证
network/socket_tcp · 基础范例 · 连接后立即接受
(xrtNetSocketAccept(Listener, &Accepted, &Remote) != XNET_RESULT_OK) ||
xrtNetSocketConnect函数
发起连接;非阻塞连接尚未完成时返回 AGAIN。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pRemote | 输入 | 非空 | 目标地址 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XNET_RESULT_OK | 操作成功 | — |
XNET_RESULT_ERROR | 失败 | — |
XNET_RESULT_AGAIN | 非阻塞暂不可推进 | — |
XNET_RESULT_CLOSED | 对象已关闭 | — |
XNET_RESULT_TRUNCATED | 结果被截断 | — |
XNET_RESULT_TIMEOUT | 期限先到期 | — |
XNET_RESULT_CANCELLED | 被取消 | — |
XNET_ERROR_SOCKET_CONNECT(系统错误)—connect()失败
范例已编译验证
socket_tour · OK/AGAIN 双路收口
xnetresult ConnResult = xrtNetSocketConnect(C, &AddrA);
if ( (ConnResult != XNET_RESULT_OK) &&
(ConnResult != XNET_RESULT_AGAIN) ) {
xrtNetSocketFinishConnect函数
在可写事件到达后读取 SO_ERROR,完成非阻塞连接判定。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 处于在途连接的 Socket |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK | 连接已建立 |
XNET_RESULT_AGAIN | 仍在途,继续轮询 |
XNET_RESULT_ERROR | 连接被拒或失败(SO_ERROR) |
XERR_ARGUMENT— 空对象XNET_ERROR_SOCKET_CONNECT(系统错误)— 远端拒绝等
xrtNetSocketShutdown函数
半关闭指定方向,不销毁 Socket 对象。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
Direction | 输入 | READ/WRITE/BOTH | WRITE 后对端读到 EOF |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已关闭指定方向 | — |
false | 系统失败 | 对象仍可用;错误经 xrtGetError() 报告 |
XNET_ERROR_SOCKET_SHUTDOWN(系统错误)—shutdown()失败
范例已编译验证
network/socket_tcp · 基础范例 · 客户端写半关
if ( !xrtNetSocketShutdown(Client, XNET_SHUTDOWN_WRITE) ) {
xrtNetSocketLocal函数
查询实际本地地址。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pAddress | 输出 | 非空 | 接收本地地址 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 系统失败 | 输出不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_NATIVE(系统错误)—getsockname()失败
xrtNetSocketRemote函数
查询已连接的对端地址。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 须为已连接 Socket |
pAddress | 输出 | 非空 | 接收对端地址 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已写出 | — |
false | 未连接或系统失败 | 输出不被修改;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_NATIVE(系统错误)—getpeername()失败
范例已编译验证
socket_tour · 连接后与目标地址全等
!xrtNetSocketRemote(A, &Remote) ||
!xrtNetAddrEqual(&Remote, &DestB) ) {
xrtNetSocketSend函数
单次发送;允许成功短写,非阻塞无法推进时返回 XNET_RESULT_AGAIN。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pData | 输入 | iSize > 0 时非空 | 发送内容 |
iSize | 输入 | — | 字节数 |
pSent | 输出 | 非空 | 成功时接收实际发送量(可短写) |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK | *pSent 字节已受理 |
XNET_RESULT_AGAIN | 非阻塞暂无法推进 |
XNET_RESULT_ERROR | 系统失败 |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_WRITE(系统错误)—send()失败
范例已编译验证
network/socket_tcp · 基础范例 · 连接后即发送
(xrtNetSocketSend(Client, "hello", 5, &iSize) != XNET_RESULT_OK) ||
xrtNetSocketRecv函数
单次接收;流式 EOF 返回 XNET_RESULT_CLOSED,非阻塞无数据返回 XNET_RESULT_AGAIN。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pData | 输出 | iSize > 0 时非空 | 接收缓冲 |
iSize | 输入 | — | 缓冲容量 |
pReceived | 输出 | 非空 | 成功时接收实际读取量 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK | *pReceived 字节可用 |
XNET_RESULT_AGAIN | 非阻塞暂无数据 |
XNET_RESULT_CLOSED | 流式对端已 EOF(*pReceived 为 0) |
XNET_RESULT_ERROR | 系统失败 |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_READ(系统错误)—recv()失败
范例已编译验证
network/socket_tcp · 基础范例 · 服务端读取五字节
(xrtNetSocketRecv(Accepted, sData, sizeof(sData) - 1,
&iSize) != XNET_RESULT_OK) ) {
xrtNetSocketSendVec函数
单次聚集发送;Span 数量不能超过 64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 连接式 |
pSpans | 输入 | iCount > 0 时非空 | 只读 Span 数组 |
iCount | 输入 | <= 64 | Span 数 |
pSent | 输出 | 非空 | 实际发送量 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERROR | 同 Send |
XERR_ARGUMENT— 空指针或 Span 数超限XNET_ERROR_SOCKET_WRITE(系统错误)
范例已编译验证
socket_tour · 两段 "xy"+"z" 三字节
(xrtNetSocketSendVec(A, Out, 2u, &iSent) != XNET_RESULT_OK) ||
xrtNetSocketRecvVec函数
单次分散接收;Span 数量不能超过 64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 连接式 |
pSpans | 输出 | iCount > 0 时非空 | 可写 Span 数组 |
iCount | 输入 | <= 64 | Span 数 |
pReceived | 输出 | 非空 | 实际读取量 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_CLOSED / XNET_RESULT_ERROR | 同 Recv |
XERR_ARGUMENT— 空指针或超限XNET_ERROR_SOCKET_READ(系统错误)
xrtNetSocketSendTo函数
单次发送数据报;允许发送零长度数据报。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pData | 输入 | 允许空指针(零长度报文) | 发送内容 |
iSize | 输入 | — | 字节数 |
pSent | 输出 | 非空 | 实际发送量 |
pRemote | 输入 | 非空 | 目标地址 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERROR | 同 Send |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_WRITE(系统错误)
范例已编译验证
socket_tour · 消息形态三字节
(xrtNetSocketSendTo(A, "msg", 3u, &iSent, &DestB) != XNET_RESULT_OK) ||
xrtNetSocketRecvFrom函数
单次接收数据报;零长度返回 XNET_RESULT_OK,缓冲不足返回 XNET_RESULT_TRUNCATED。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pData | 输出 | iSize > 0 时非空 | 接收缓冲 |
iSize | 输入 | — | 缓冲容量 |
pReceived | 输出 | 非空 | 实际读取量 |
pRemote | 输出 | 非空 | 发送方地址 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK | *pReceived 字节可用(可为 0) |
XNET_RESULT_AGAIN | 非阻塞暂无数据 |
XNET_RESULT_TRUNCATED | 报文超过缓冲容量(余量被截去) |
XNET_RESULT_ERROR | 系统失败 |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_READ(系统错误)
xrtNetSocketSendToVec函数
单次聚集发送数据报;Span 数量不能超过 64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pSpans | 输入 | iCount > 0 时非空 | 聚集 Span |
iCount | 输入 | <= 64 | Span 数 |
pSent | 输出 | 非空 | 实际发送量 |
pRemote | 输入 | 非空 | 目标地址 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERROR | 同 SendTo |
XERR_ARGUMENT— 空指针或超限XNET_ERROR_SOCKET_WRITE(系统错误)
范例已编译验证
socket_tour · 两段 "ab"+"cd" 四字节
if ( (xrtNetSocketSendToVec(A, Out, 2u, &iSent, &DestB) != XNET_RESULT_OK) ||
xrtNetSocketRecvFromVec函数
单次分散接收数据报;Span 数量不能超过 64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pSpans | 输出 | iCount > 0 时非空 | 分散 Span |
iCount | 输入 | <= 64 | Span 数 |
pReceived | 输出 | 非空 | 实际读取量 |
pRemote | 输出 | 非空 | 发送方地址 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_TRUNCATED / XNET_RESULT_ERROR | 同 RecvFrom |
XERR_ARGUMENT— 空指针或超限XNET_ERROR_SOCKET_READ(系统错误)
范例已编译验证
socket_tour · 与 SendToVec 四字节配对
(xrtNetSocketRecvFromVec(B, In, 2u, &iGot, &From) != XNET_RESULT_OK) ||
xrtNetSocketSendMsg函数
发送数据报并覆盖本包源地址、接口、Hop Limit 或 Traffic Class。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pData | 输入 | 允许空指针 | 发送内容 |
iSize | 输入 | — | 字节数 |
pSent | 输出 | 非空 | 实际发送量 |
pRemote | 输入 | 非空 | 目标地址 |
pControl | 输入 | 允许空指针 | 逐包控制;空表示无覆盖 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERROR | 同 SendTo |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_WRITE(系统错误)
范例已编译验证
socket_tour · 多播自收一包(SendTo 同型路径)
McResult = xrtNetSocketSendTo(A, "m", 1u, &iSent, &Group);
xrtNetSocketSendMsgVec函数
聚集发送带逐包控制的数据报;Span 数量不能超过 64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pSpans | 输入 | iCount > 0 时非空 | 聚集 Span |
iCount | 输入 | <= 64 | Span 数 |
pSent | 输出 | 非空 | 实际发送量 |
pRemote | 输入 | 非空 | 目标地址 |
pControl | 输入 | 允许空指针 | 逐包控制 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERROR | 同 SendTo |
XERR_ARGUMENT— 空指针或超限XNET_ERROR_SOCKET_WRITE(系统错误)
范例已编译验证
socket_tour · 零控制双段四字节
if ( (xrtNetSocketSendMsgVec(A, Out, 2u, &iSent, &DestB, &Control) != XNET_RESULT_OK) ||
xrtNetSocketRecvMsg函数
接收数据报及已启用的目标、接口、Hop Limit 和 Traffic Class 元数据。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pData | 输出 | iSize > 0 时非空 | 接收缓冲 |
iSize | 输入 | — | 缓冲容量 |
pReceived | 输出 | 非空 | 实际读取量 |
pRemote | 输出 | 非空 | 发送方地址 |
pMeta | 输出 | 非空 | 元数据结构;传 NULL 是参数错误——与 RecvFrom 的差异点 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_TRUNCATED / XNET_RESULT_ERROR | 同 RecvFrom;Meta.Flags 标记有效字段 |
XERR_ARGUMENT— 空指针(含pMeta == NULL)XNET_ERROR_SOCKET_READ(系统错误)
范例已编译验证
socket_tour · 与 SendTo 三字节配对
(xrtNetSocketRecvMsg(B, arrBuf, 64u, &iGot, &From, &Meta) != XNET_RESULT_OK) || (iGot != 3u) ||
xrtNetSocketRecvMsgVec函数
分散接收数据报及元数据,Span 数量不能超过 64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pSpans | 输出 | iCount > 0 时非空 | 分散 Span |
iCount | 输入 | <= 64 | Span 数 |
pReceived | 输出 | 非空 | 实际读取量 |
pRemote | 输出 | 非空 | 发送方地址 |
pMeta | 输出 | 非空 | 元数据结构 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_TRUNCATED / XNET_RESULT_ERROR | 同 RecvFrom |
XERR_ARGUMENT— 空指针或超限XNET_ERROR_SOCKET_READ(系统错误)
范例已编译验证
socket_tour · 与 SendMsgVec 四字节配对
(xrtNetSocketRecvMsgVec(B, In, 2u, &iGot, &From, &Meta) != XNET_RESULT_OK) ||
xrtNetSocketRecvBatch函数
接收最多 64 个数据报;返回已消费前缀,每项独立记录 XNET_RESULT_OK 或 XNET_RESULT_TRUNCATED。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pItems | 输出 | iCapacity > 0 时非空 | 调用方提供缓冲的接收项数组 |
iCapacity | 输入 | <= 64 | 最多接收数 |
pReceived | 输出 | 非空 | 已到达前缀数(可能小于发送量) |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERROR | 每项自带 Result/Size/Remote |
XERR_ARGUMENT— 空指针或超限XNET_ERROR_SOCKET_READ(系统错误)
范例已编译验证
socket_tour · 两包批量含部分到达补收
if ( (xrtNetSocketSendBatch(A, Send, 2u, &iSent) != XNET_RESULT_OK) ||
(iSent != 2u) ||
(xrtNetSocketRecvBatch(B, Recv, 2u, &iGot) != XNET_RESULT_OK) ) {
xrtNetSocketSendBatch函数
发送最多 64 个数据报;返回已经完整发送的输入前缀。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pItems | 输入 | iCount > 0 时非空 | 调用期间借用数据 |
iCount | 输入 | <= 64 | 发送项数 |
pSent | 输出 | 非空 | 已完整发送的项数 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERROR | XNET_RESULT_AGAIN 表示队列暂满,稍后重试剩余 |
XERR_ARGUMENT— 空指针或超限XERR_IO+XNET_ERROR_SOCKET_WRITE— 某项系统失败XNET_ERROR_SOCKET_WRITE(系统错误)
范例已编译验证
socket_tour · 双项批量(连接式空远端)
if ( (xrtNetSocketSendBatch(A, Send, 2u, &iSent) != XNET_RESULT_OK) ||
xrtNetSocketDgramMetaAvailable函数
返回当前平台和地址族可能提供的数据报接收元数据位。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 位集 | 平台可能支持的 XNET_DGRAM_META_* 位组合 |
XNET_ERROR_SOCKET_OPTION(系统错误)— 探测失败
xrtNetSocketDgramMetaEnabled函数
返回 Socket 当前已经启用的数据报接收元数据位。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 位集 | 已启用位(默认 0) |
xrtNetSocketDgramMetaSet函数
成功后精确设置接收元数据位。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 数据报 Socket |
iFlags | 输入 | 合法元数据位组合 | 期望启用的位集 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已生效;Enabled 反映实际位 | — |
false | 参数非法、平台不支持或系统失败 | 可查询 Enabled 看实际生效状态;错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空对象XERR_RANGE— 含非法元数据位XERR_UNSUPPORTED— 平台不支持全部请求位XNET_ERROR_SOCKET_OPTION(系统错误)
范例已编译验证
socket_tour · 启用 Hop Limit 后收包带 HopLimit
if ( !xrtNetSocketDgramMetaSet(B, XNET_DGRAM_META_HOP_LIMIT) ||
xrtNetSocketDgramControlAvailable函数
返回当前平台、地址族和 Socket Provider 可用的逐数据报发送控制位。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
| 返回 | 含义 |
|---|---|
| 位集 | 可用的 XNET_DGRAM_CONTROL_* 位组合 |
XNET_ERROR_SOCKET_OPTION(系统错误)— 探测失败
xrtNetSocketDgramCapabilities函数
返回 PMTU、错误队列及后续高级数据报能力。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 非数据报 Socket 返回零 |
| 返回 | 含义 |
|---|---|
| 位集 | 数据报高级能力位;含 XNET_OPTION_DGRAM_ERRORS 可设性等 |
XNET_ERROR_SOCKET_OPTION(系统错误)— 探测失败
xrtNetSocketDgramRecvError函数
非阻塞读取一个已启用的异步数据报错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pData | 输出 | 允许空指针 | 错误附带的原始数据 |
iSize | 输入 | — | 缓冲容量 |
pReceived | 输出 | 非空 | 附带数据量 |
pError | 输出 | 非空 | 错误描述结构 |
| 返回 | 含义 |
|---|---|
XNET_RESULT_OK | 已读取一个排队错误 |
XNET_RESULT_AGAIN | 队列为空(Linux 上空队列返回本值) |
XNET_RESULT_ERROR | 平台不支持或失败(Windows 恒 XNET_RESULT_ERROR:"not supported on this platform") |
XERR_UNSUPPORTED— 平台无IP_RECVERR等价物
范例已编译验证
socket_tour · 平台能力门控(Windows 不支持)
xnetresult ErrResult = xrtNetSocketDgramRecvError(A,
arrBuf, sizeof(arrBuf), &iGot, &DgramError);
if ( ErrResult == XNET_RESULT_OK ) {
xrtNetSocketMulticastJoin函数
将数据报 Socket 加入一个同地址族多播组。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | 数据报 Socket |
pGroup | 输入 | 非空、同族多播地址 | 目标组 |
pInterface | 输入 | 非空 | 指定出接口;IPv6 使用 Scope 作为接口索引 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已加入 | — |
false | 系统失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_OPTION(系统错误)—setsockopt(IP_ADD_MEMBERSHIP)失败
xrtNetSocketMulticastLeave函数
将数据报 Socket 移出一个多播组。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pGroup | 输入 | 非空 | 已加入的组 |
pInterface | 输入 | 非空 | 与加入时相同的接口 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已移出 | — |
false | 系统失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空指针XNET_ERROR_SOCKET_OPTION(系统错误)—IP_DROP_MEMBERSHIP失败
范例已编译验证
socket_tour · 自收验证后移出
if ( !xrtNetSocketMulticastLeave(B, &Group, &Iface) ||
!xrtNetSocketMulticastInterface(A, NULL) ) {
xrtNetSocketMulticastLoop函数
设置数据报 Socket 是否接收自己发出的多播报文。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
bEnabled | 输入 | — | 自收开关 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已设置 | — |
false | 系统失败 | 错误经 xrtGetError() 报告 |
XNET_ERROR_SOCKET_OPTION(系统错误)—IP_MULTICAST_LOOP失败
xrtNetSocketMulticastHopLimit函数
设置数据报 Socket 的多播跳数,合法范围为 0 到 255。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
iHopLimit | 输入 | [0, 255] | 多播 TTL |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已设置 | — |
false | 系统失败 | 错误经 xrtGetError() 报告 |
XNET_ERROR_SOCKET_OPTION(系统错误)—IP_MULTICAST_TTL失败
xrtNetSocketMulticastInterface函数
选择多播发送接口;空接口恢复系统默认。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Socket | 输入 | 非空 | — |
pInterface | 输入 | 允许空指针 | 空恢复默认;IPv6 使用 Scope 接口索引 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已设置 | — |
false | 系统失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 空对象XNET_ERROR_SOCKET_OPTION(系统错误)—IP_MULTICAST_IF失败
xrtNetPortConfigInit函数
初始化端口配置为默认值:Backend=AUTO、PostLimit=4096、WatchLimit=0、OperationLimit=0、OperationCache=64。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 非空 | 接收默认配置 |
| 返回 | 含义 |
|---|---|
| 无 | 纯初始化,不失败 |
范例已编译验证
network/port_tour · 双后端 · 每次创建端口前重新初始化
xrtNetPortConfigInit(&Config); Config.Backend = XNET_PORT_IOCP; pIocp = xrtNetPortCreate(&Config); xrtNetPortConfigInit(&Config); Config.Backend = XNET_PORT_SELECT; pSelect = xrtNetPortCreate(&Config);
xrtNetPortCreate函数
创建事件端口。AUTO 在当前已编译后端中选择最高能力实现:Windows 优先 IOCP,Linux 优先 epoll,Darwin/BSD 优先 kqueue,其他平台使用 select;显式指定的后端不可用时返回 XERR_UNSUPPORTED,不会静默换后端。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输入 | 非空 | 通常为 ConfigInit 产物,可按需覆盖字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 端口已创建,创建线程即拥有线程 | — |
NULL | 配置非法、后端不可用或资源不足 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_CREATE— 配置指针为空或字段非法XERR_UNSUPPORTED+XNET_ERROR_PORT_CREATE— 显式后端未编译进当前构建- 内存分配失败 — 内部资源(唤醒通道、索引表)分配失败
范例已编译验证
network/port_tour · 双后端 · 显式指定 IOCP 与 SELECT 各建一个
xrtNetPortConfigInit(&Config); Config.Backend = XNET_PORT_IOCP; pIocp = xrtNetPortCreate(&Config); xrtNetPortConfigInit(&Config); Config.Backend = XNET_PORT_SELECT; pSelect = xrtNetPortCreate(&Config);
xrtNetPortDestroy函数
取消并排空全部在途 IO,再销毁端口、观察、用户事件及唤醒资源;返回后系统不再引用任何调用方缓冲。只能由拥有线程调用。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 允许空指针 | 空指针是空操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 端口已销毁 | — |
false | 参数非法、非拥有线程或底层关闭失败 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pPort非法XERR_STATE— 从非拥有线程调用XERR_IO+XNET_ERROR_PORT_CLOSE— 关闭后端句柄失败
范例已编译验证
network/port_tour · 收尾 · 先关 Socket 再销毁端口
if ( pSelect != NULL ) {
xrtNetPortDestroy(pSelect);
}
if ( pIocp != NULL ) {
xrtNetPortDestroy(pIocp);
}
xrtNetPortBackend函数
返回端口实际启用的后端。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 端口指针 |
| 返回 | 含义 |
|---|---|
XNET_PORT_AUTO | pPort 为空(AUTO 是零值,仅作失败哨兵) |
XNET_PORT_IOCP/XNET_PORT_URING/XNET_PORT_EPOLL/XNET_PORT_KQUEUE/XNET_PORT_SELECT | 实际后端;AUTO 创建后此处是解析结果 |
XERR_ARGUMENT—pPort为空(返回值仍是XNET_PORT_AUTO)
范例已编译验证
network/port_tour · 双后端 · 校验显式后端未被替换
if ( (pIocp == NULL) || (pSelect == NULL) ||
(xrtNetPortBackend(pIocp) != XNET_PORT_IOCP) ||
(xrtNetPortBackend(pSelect) != XNET_PORT_SELECT) ) {
goto Cleanup;
}
xrtNetPortGetConfig函数
返回已经解析 AUTO 容量和实际后端的有效配置。返回值是副本,修改它不影响端口。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 端口指针 |
pConfig | 输出 | 非空 | 接收解析后的配置副本 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | *pConfig 已写入 | — |
false | 参数非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 任一指针为空
范例已编译验证
network/port_tour · 自省 · 零值上限被解析为后端硬上限
{
xnetportconfig Resolved;
if ( !xrtNetPortGetConfig(pIocp, &Resolved) ||
(Resolved.Backend != XNET_PORT_IOCP) ) {
goto Cleanup;
}
}
xrtNetPortName函数
返回静态后端名称(如 "iocp"、"select"),字符串存活期与进程相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 端口指针 |
| 返回 | 含义 |
|---|---|
非空 cstr | 静态后端名称 |
NULL | pPort 为空 |
XERR_ARGUMENT—pPort为空
范例已编译验证
network/port_iocp · 完成式 · 诊断输出中打印后端名
printf("backend=%s bytes=%zu data=%s\n",
xrtNetPortName(pPort), Events[i].Bytes, sData);
xrtNetPortCapabilities函数
返回实际后端能力位(XNET_PORT_CAP_* 的按位或)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 端口指针 |
| 返回 | 含义 |
|---|---|
| 能力位组合 | READINESS/COMPLETION/ONESHOT/EDGE/BATCH/WAKE/POST/CANCEL/READ_PROBE 的按位或 |
0 | pPort 为空(无后端具备零能力,可作失败哨兵) |
XERR_ARGUMENT—pPort为空
范例已编译验证
network/port_tour · 双后端 · IOCP 只有 COMPLETION,没有 READINESS
iCaps = xrtNetPortCapabilities(pIocp);
if ( ((iCaps & XNET_PORT_CAP_COMPLETION) == 0u) ||
((iCaps & XNET_PORT_CAP_READINESS) != 0u) ) {
goto Cleanup;
}
xrtNetPortAccept函数
异步接受一个连接。成功提交后 Accepted Socket 由终态事件(ACCEPT)转移给调用方,调用方成为其唯一拥有者。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已监听 | 必须是 Listen 状态的流 Socket |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;ACCEPT 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法或Socket不是监听流XERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力(如 SELECT)XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · TCP · Event.Accepted 是新 Socket
!xrtNetPortConnect(pIocp, Client, &AddrListen, 201u, NULL) ||
!xrtNetPortAccept(pIocp, Listener, 202u, NULL) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_CONNECT, 201u,
&Event, 2000000ull) ||
(Event.Result != XNET_RESULT_OK) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_ACCEPT, 202u,
&Event, 2000000ull) ||
(Event.Accepted == 0) ) {
goto Cleanup;
}
xrtNetPortConnect函数
异步连接远端地址。终态事件(CONNECT)到达前 Socket 必须保持有效。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已打开 | 未连接的流 Socket |
pRemote | 输入 | 非空 | 目标地址;族必须与 Socket 一致 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;CONNECT 终态事件待提取,结果在 Event.Result | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法或地址族与 Socket 不匹配XERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · TCP · 连接结果在终态事件的 Result 字段
!xrtNetPortConnect(pIocp, Client, &AddrListen, 201u, NULL) || !xrtNetPortAccept(pIocp, Listener, 202u, NULL) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_CONNECT, 201u, &Event, 2000000ull) || (Event.Result != XNET_RESULT_OK) ||
xrtNetPortReadProbe函数
异步等待流 Socket 可读;不借用数据缓冲,终态(READ_PROBE,Bytes == 0)到达后再提交 Recv 才读取数据或确认 EOF。适合 TLS 等由上层状态机驱动读取的场景。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 具备 READ_PROBE 能力的后端 |
Socket | 输入 | 已连接流 | 只接受流 Socket |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;可读或 EOF 时产生 READ_PROBE 终态 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法或Socket不是流XERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力,或后端无法探询流可读性(无READ_PROBE能力)XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · TCP · 探针终态后再提交 Recv
if ( !xrtNetPortReadProbe(pIocp, Server, 203u, NULL) ||
(xrtNetSocketSend(Client, "hi", 2u, &iSent) !=
XNET_RESULT_OK) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_READ_PROBE, 203u,
&Event, 2000000ull) ) {
goto Cleanup;
}
xrtNetPortRecv函数
异步接收到调用方缓冲;支持流和已连接数据报,单次最多 INT_MAX 字节。等价于单跨度 RecvVec,错误集与之相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已连接 | 流或已连接数据报 |
pData | 输入/输出 | 借用至终态 | 接收缓冲,流接收必须非空 |
iSize | 输入 | <= INT_MAX | 缓冲字节数 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;RECV 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、流接收缓冲为空或大小超限XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 请求字节数超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · TCP · 实际读取量在 Event.Bytes
if ( !xrtNetPortRecv(pIocp, Server, arrBuf, 8u, 204u, NULL) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_RECV, 204u, &Event, 2000000ull) || (Event.Bytes != 2u) || (memcmp(arrBuf, "hi", 2u) != 0) ||
xrtNetPortRecvVec函数
异步分散接收;支持流和已连接数据报,Span 总长度最多 INT_MAX 字节。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已连接 | 流或已连接数据报 |
pSpans | 输入/输出 | 借用至终态 | 可写跨度数组;提交时复制描述符 |
iCount | 输入 | > 0 | 跨度数量 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;RECV 终态事件待提取,Bytes 为全部跨度写入总量 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、跨度数组为空、单跨度非法或流接收总长为零XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 跨度总长超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 流向量 · 两段分散接收
if ( !xrtNetPortRecvVec(pIocp, Server, In, 2u, 210u, NULL) || (xrtNetSocketSendVec(Client, Out, 2u, &iSent) != XNET_RESULT_OK) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_RECV, 210u, &Event, 2000000ull) || (Event.Bytes != 4u) ||
xrtNetPortSend函数
异步发送调用方缓冲;支持流和已连接数据报,单次最多 INT_MAX 字节。等价于单跨度 SendVec,错误集与之相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已连接 | 流或已连接数据报 |
pData | 输入 | 借用至终态 | 只读发送数据,期间不得修改 |
iSize | 输入 | <= INT_MAX | 发送字节数 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;SEND 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法或发送缓冲/大小非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 发送字节数超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · TCP · 发送完成即缓冲可复用
!xrtNetPortSend(pIocp, Server, "ok", 2u, 205u, NULL) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_SEND, 205u,
&Event, 2000000ull) ) {
goto Cleanup;
}
xrtNetPortSendVec函数
异步聚集发送;支持流和已连接数据报,Span 总长度最多 INT_MAX 字节。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已连接 | 流或已连接数据报 |
pSpans | 输入 | 借用至终态 | 只读跨度数组;提交时复制描述符 |
iCount | 输入 | > 0 | 跨度数量 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;SEND 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、跨度数组为空或单跨度非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 跨度总长超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 流向量 · 两段聚集发送
!xrtNetPortSendVec(pIocp, Server, Out, 2u, 211u, NULL) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_SEND, 211u,
&Event, 2000000ull) ) {
goto Cleanup;
}
xrtNetPortRecvFrom函数
异步接收数据报;远端地址由终态事件(RECV_FROM)的 Address 字段返回。等价于单跨度 RecvFromVec,错误集与之相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 数据报 | 未连接或已连接数据报 |
pData | 输入/输出 | 借用至终态 | 接收缓冲 |
iSize | 输入 | <= INT_MAX | 缓冲字节数;不足时终态为 TRUNCATED |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;RECV_FROM 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法或缓冲/大小非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 缓冲超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_iocp · 完成式 · 终态事件带来源地址
!xrtNetPortRecvFrom(pPort, Server, sData, sizeof(sData) - 1, 1, NULL) ||
xrtNetPortRecvFromVec函数
异步分散接收数据报;缓冲不足由终态事件返回 TRUNCATED,Bytes 保留实际写入长度。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 数据报 | 未连接或已连接数据报 |
pSpans | 输入/输出 | 借用至终态 | 可写跨度数组;提交时复制描述符 |
iCount | 输入 | > 0 | 跨度数量 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;RECV_FROM 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、跨度数组为空或单跨度非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 跨度总长超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 数据报 · 来源端口在 Event.Address.Port
if ( !xrtNetPortRecvFromVec(pIocp, UdpA, In, 2u, 220u, NULL) || (xrtNetSocketSendTo(UdpB, "d1", 2u, &iSent, &DestUdpA) != XNET_RESULT_OK) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_RECV_FROM, 220u, &Event, 2000000ull) ||
xrtNetPortRecvMsg函数
异步接收数据报及 Socket 已启用的元数据;终态事件(RECV_MSG)同时返回 Address 与 Meta。等价于单跨度 RecvMsgVec,错误集与之相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已启用元数据 | 须先 xrtNetSocketDgramMetaSet 启用至少一位 |
pData | 输入/输出 | 借用至终态 | 接收缓冲 |
iSize | 输入 | <= INT_MAX | 缓冲字节数 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;RECV_MSG 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_PORT_SUBMIT— Socket 未启用任何接收元数据XERR_ARGUMENT/XERR_RANGE/XERR_UNSUPPORTED/XERR_STATE(拥有线程)— 同RecvVecXERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimit
范例已编译验证
network/port_tour · 数据报 · 终态事件携带已启用的元数据位
if ( !xrtNetPortRecvMsg(pIocp, UdpA, arrBuf, 16u, 221u, NULL) || (xrtNetSocketSendTo(UdpB, "d2", 2u, &iSent, &DestUdpA) != XNET_RESULT_OK) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_RECV_MSG, 221u, &Event, 2000000ull) || (Event.Bytes != 2u) ||
xrtNetPortRecvMsgVec函数
异步分散接收数据报及元数据;终态事件同时返回 Address 和 Meta。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 已启用元数据 | 须先 xrtNetSocketDgramMetaSet 启用至少一位 |
pSpans | 输入/输出 | 借用至终态 | 可写跨度数组;提交时复制描述符 |
iCount | 输入 | > 0 | 跨度数量 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;RECV_MSG 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_PORT_SUBMIT— Socket 未启用任何接收元数据XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、跨度数组为空或单跨度非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 跨度总长超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 数据报 · 分散接收第三形态
if ( !xrtNetPortRecvMsgVec(pIocp, UdpA, In, 2u, 222u, NULL) || (xrtNetSocketSendTo(UdpB, "d3", 2u, &iSent, &DestUdpA) != XNET_RESULT_OK) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_RECV_MSG, 222u, &Event, 2000000ull) ||
xrtNetPortRecvError函数
异步等待并读取一个数据报错误;终态(RECV_ERROR)同时返回原负载前缀和 DgramError。要求 Socket 已启用数据报错误队列,且后端支持等待该队列。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 支持数据报错误等待的后端 |
Socket | 输入 | 已启用错误队列 | 须先 xrtNetSocketDgramErrorSet 启用 |
pData | 输入/输出 | 借用至终态 | 接收原负载前缀的缓冲 |
iSize | 输入 | <= INT_MAX | 缓冲字节数 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;RECV_ERROR 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_PORT_SUBMIT— Socket 未启用数据报错误队列XERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— Socket 不支持错误队列(平台限制),或后端无法等待数据报错误(如 IOCP)XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法或缓冲/大小非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 缓冲超过INT_MAXXERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 平台门控 · Windows IOCP 上提交被拒是预期行为
if ( xrtNetPortRecvError(pIocp, UdpA, arrBuf, 16u, 300u, NULL) ) {
goto Cleanup;
}
xrtNetPortSendTo函数
异步发送数据报;远端地址在提交时复制,提交返回后可立即复用地址对象。等价于单跨度 SendToVec,错误集与之相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 数据报 | 未连接数据报 Socket |
pData | 输入 | 借用至终态 | 只读发送数据 |
iSize | 输入 | <= INT_MAX | 发送字节数,允许零长度报文 |
pRemote | 输入 | 非空 | 目标地址;族与 Socket 一致,提交时复制 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;SEND_TO 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、地址族不匹配或缓冲/大小非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 发送字节数超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_uring · 完成式 · 提交后地址对象即可复用
!xrtNetPortSendTo( pPort, Client, "completion", 10, &Address, 2, NULL ) ||
xrtNetPortSendToVec函数
异步聚集发送数据报;远端地址和 Span 描述符在提交时复制。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 数据报 | 未连接数据报 Socket |
pSpans | 输入 | 借用至终态 | 只读跨度数组;提交时复制描述符 |
iCount | 输入 | > 0 | 跨度数量 |
pRemote | 输入 | 非空 | 目标地址;提交时复制 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;SEND_TO 终态事件待提取 | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、地址族不匹配、跨度数组为空或单跨度非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 跨度总长超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 数据报发送 · 两段聚集发送
if ( !xrtNetPortSendToVec(pIocp, UdpB, Out, 2u, &DestUdpA, 230u, NULL) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_SEND_TO, 230u, &Event, 2000000ull) || (Event.Result != XNET_RESULT_OK) ||
xrtNetPortSendMsg函数
异步发送带逐包控制的数据报;地址和控制值在提交时复制。非零控制 Flags 的终态为 SEND_MSG;空控制或零 Flags 走普通发送路径,有 pRemote 时终态为 SEND_TO,否则为 SEND(Socket 须已连接)。等价于单跨度 SendMsgVec,错误集与之相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 数据报 | 数据报 Socket |
pData | 输入 | 借用至终态 | 只读发送数据 |
iSize | 输入 | <= INT_MAX | 发送字节数 |
pRemote | 输入 | 可空 | 目标地址;空表示 Socket 已连接 |
pControl | 输入 | 可空 | 逐包控制;空或零 Flags 走普通发送 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;终态类型按控制与地址组合(见上文) | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、地址族不匹配或缓冲/大小非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 发送字节数超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_iocp · 完成式 · 逐包覆盖源地址发送
!xrtNetPortSendMsg(pPort, Client, "completion", 10, &Address, &Control, 2, NULL) ||
xrtNetPortSendMsgVec函数
异步聚集发送带逐包控制的数据报;Span 描述符、地址和控制值在提交时复制。终态类型与 SendMsg 相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | completion 后端端口 |
Socket | 输入 | 数据报 | 数据报 Socket |
pSpans | 输入 | 借用至终态 | 只读跨度数组;提交时复制描述符 |
iCount | 输入 | > 0 | 跨度数量 |
pRemote | 输入 | 可空 | 目标地址;空表示 Socket 已连接 |
pControl | 输入 | 可空 | 逐包控制;空或零 Flags 走普通发送 |
Id | 输入 | 非零且唯一 | 终态事件身份 |
pUser | 输入 | 任意值 | 原样进入终态事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;终态类型按控制与地址组合(同 SendMsg) | — |
false | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_SUBMIT— 参数非法、地址族不匹配、跨度数组为空或单跨度非法XERR_RANGE+XNET_ERROR_PORT_SUBMIT— 跨度总长超过INT_MAXXERR_UNSUPPORTED+XNET_ERROR_PORT_SUBMIT— 后端没有 completion 能力XERR_AGAIN+XNET_ERROR_PORT_SUBMIT— 在途操作数达到OperationLimitXERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 数据报发送 · 零 Flags 控制走 SEND_TO 路径
!xrtNetPortSendMsgVec(pIocp, UdpB, Out, 2u, &DestUdpA,
&Control, 231u, NULL) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_SEND_TO, 231u,
&Event, 2000000ull) ||
(Event.Result != XNET_RESULT_OK) ) {
goto Cleanup;
}
xrtNetPortCancel函数
请求取消指定 Id 的在途操作。操作仍以一个终态事件结束:取消成功时为 CANCELLED,完成先于取消发生时仍是原完成。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 支持取消的后端 |
Id | 输入 | 非零 | 要取消的在途操作 ID |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 取消请求已受理;仍须等待该操作唯一终态 | — |
false | 参数非法、后端不支持取消或非拥有线程 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_CANCEL—pPort/Id非法XERR_UNSUPPORTED+XNET_ERROR_PORT_CANCEL— 后端不支持取消XERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · 取消 · 在途 Recv 以 CANCELLED 终结
if ( !xrtNetPortRecv(pIocp, UdpA, arrBuf, 8u, 600u, NULL) ||
!xrtNetPortCancel(pIocp, 600u) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_RECV, 600u,
&Event, 2000000ull) ||
(Event.Result != XNET_RESULT_CANCELLED) ) {
xrtNetPortWatch函数
替换一个 Socket 的 readiness 关注位;事件为零等价于 Unwatch。每 Socket 单份观察,重复 Watch 覆盖旧关注位与事件身份。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | readiness 后端端口 |
Socket | 输入 | 已打开 | 要观察的 Socket |
Id | 输入 | 非零 | 事件身份;替换观察时同时替换 |
iEvents | 输入 | XNET_PORT_EVENT_* 位 | 关注方向;READ/WRITE 等,零等价 Unwatch |
pUser | 输入 | 任意值 | 原样进入事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 内核观察与用户身份均已登记 | — |
false | 未登记 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_WATCH— 参数非法XERR_UNSUPPORTED+XNET_ERROR_PORT_WATCH— 后端没有 readiness 能力(如 IOCP)XERR_RANGE+XNET_ERROR_PORT_WATCH— 观察数达到WatchLimit(select 还受FD_SETSIZE约束)XERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · readiness · SELECT 端口上观察读方向
if ( !xrtNetPortWatch(pSelect, UdpA, 100u, XNET_PORT_EVENT_READ,
NULL) ||
(xrtNetSocketSendTo(UdpB, "r", 1u, &iSent, &DestUdpA) !=
XNET_RESULT_OK) ||
!exampleWaitFor(pSelect, XNET_PORT_EVENT_READY, 100u,
&Event, 2000000ull) ||
!xrtNetPortUnwatch(pSelect, UdpA) ) {
goto Cleanup;
}
xrtNetPortUnwatch函数
幂等移除观察。失败也会退休用户身份,调用方随后必须关闭该 Socket,不能继续观察或执行 IO。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | readiness 后端端口 |
Socket | 输入 | 已打开 | 要移除观察的 Socket |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 内核观察和用户身份均已移除 | — |
false | 移除失败,但用户身份仍已退休;须立即关闭该 Socket | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_WATCH— 参数非法XERR_UNSUPPORTED+XNET_ERROR_PORT_WATCH— 后端没有 readiness 能力XERR_STATE— 从非拥有线程调用
范例已编译验证
network/port_tour · readiness · 消费事件后移除观察
!exampleWaitFor(pSelect, XNET_PORT_EVENT_READY, 100u,
&Event, 2000000ull) ||
!xrtNetPortUnwatch(pSelect, UdpA) ) {
goto Cleanup;
}
xrtNetPortWait函数
等待到事件、截止时间或错误;成功和超时都会先清零 *pCount。只能由拥有线程调用。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 端口指针 |
pEvents | 输出 | 非空数组 | 事件输出缓冲 |
iCapacity | 输入 | > 0 | 输出容量;后端一次最多写入这么多事件 |
iTimeout | 输入 | 相对毫秒 | 零表示不等待,XRT_WAIT_FOREVER 表示无限等待 |
pCount | 输出 | 非空 | 实际写入事件数;进入时即清零 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
XNET_RESULT_OK | 操作成功 | — |
XNET_RESULT_AGAIN | 非阻塞暂不可推进 | 不设错误 |
XNET_RESULT_CLOSED | 对象已关闭 | 不设错误 |
XNET_RESULT_TRUNCATED | 结果被截断 | 不设错误 |
XNET_RESULT_TIMEOUT | 期限先到期 | 不设错误 |
XNET_RESULT_CANCELLED | 被取消 | 不设错误 |
XNET_RESULT_ERROR | 失败 | xrt.net 域错误 |
XERR_ARGUMENT+XNET_ERROR_PORT_WAIT— 缓冲为空、容量为零或pCount为空XERR_STATE— 从非拥有线程调用XERR_IO+XNET_ERROR_PORT_WAIT— 后端等待系统调用失败
范例已编译验证
network/port_tour · 等待辅助 · 截止时间分片轮询
if ( xrtNetPortWait(pPort, Events, 8u,
iTimeoutUs / 100u,
&iCount) != XNET_RESULT_OK ) {
continue;
}
xrtNetPortPost函数
跨线程投递一个不会合并的用户事件(USER)。Id 与 pUser 原样进入事件。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 端口指针;跨线程调用仍须保证对象存活 |
Id | 输入 | 非零 | 事件身份 |
pUser | 输入 | 任意值 | 原样进入事件 User 字段 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 事件已入队,等待中必然可提取 | — |
false | 未入队,不留幽灵事件 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_POST—pPort/Id非法XERR_STATE+XNET_ERROR_PORT_POST— 端口正在关闭XERR_AGAIN+XNET_ERROR_PORT_POST— 用户事件队列达到PostLimit
范例已编译验证
network/port_tour · 用户事件 · USER 事件携带 Id
if ( !xrtNetPortPost(pIocp, 777u, NULL) || !exampleWaitFor(pIocp, XNET_PORT_EVENT_USER, 777u, &Event, 2000000ull) ||
xrtNetPortWake函数
跨线程请求一个可合并的 WAKE 事件;连续请求只产生一个事件。适合“命令队列已有工作”式通知。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPort | 输入 | 非空 | 端口指针 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已有挂起 WAKE 或新请求了一个 | — |
false | 未请求 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_PORT_POST—pPort非法XERR_STATE+XNET_ERROR_PORT_POST— 端口正在关闭
范例已编译验证
network/port_tour · 唤醒 · WAKE 事件 Id 为零
!xrtNetPortWake(pIocp) ||
!exampleWaitFor(pIocp, XNET_PORT_EVENT_WAKE, 0u,
&Event, 2000000ull) ) {
goto Cleanup;
}
xrtNetPostInit函数
初始化一个尚未投递的嵌入式 Post;清零节点并写入内部魔数。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPost | 输出 | 非空 | 嵌入调用方结构的 xnetpost |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 节点已就绪,可投递 | — |
false | pPost 非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pPost为空或范围非法
范例已编译验证
network/engine_tour · 嵌入式 Post · 初始化后立即投递
if ( !xrtNetPostInit(&Post) ||
!xrtNetPost(pWorker0, &Post,
exampleSimpleTask, (ptr)&bTaskDone) ) {
goto Cleanup;
}
xrtNetPostPending函数
判断嵌入式 Post 是否仍在 Worker 队列中等待执行;执行完成后清除。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pPost | 输入 | 非空 | 已 PostInit 的节点 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理投递、尚未执行 | — |
false | 已执行完成,或从未投递成功 | 参数非法/状态非法时错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pPost为空或范围非法XERR_STATE— 节点未经xrtNetPostInit初始化(魔数不匹配)
范例已编译验证
network/engine_tour · 嵌入式 Post · 受理为真,执行后为假
if ( !xrtNetPostPending(&Post) ) {
goto Cleanup;
}
if ( !exampleSpinUntil(&bTaskDone, 2000u) ||
xrtNetPostPending(&Post) ) {
goto Cleanup;
}
xrtNetPost函数
无分配地投递到指定 Worker;同一 Post 在出队前不能再次投递。从 Worker 自身线程调用时直接入队不阻塞,跨线程投递经有界提交段进入。受理失败时节点状态回滚,不留半提交状态。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | 目标 Worker;须保持存活到回调返回 |
pPost | 输入/输出 | 已 PostInit | 嵌入式任务节点 |
pProc | 输入 | 非空 | 任务回调,在亲和 Worker 上执行一次 |
pData | 输入 | 任意值 | 原样传给回调 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;回调必在目标 Worker 上执行一次 | — |
false | 未受理,节点无残留状态 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pWorker/pPost/pProc为空或非法XERR_STATE—pPost未经xrtNetPostInit初始化,或仍在队列中等待(不能重复投递)XERR_CLOSED+XNET_ERROR_ENGINE_POST— Worker 未运行、不再受理投递或关停已封口
范例已编译验证
network/engine_tour · 嵌入式 Post · 投递固定任务并自旋等待
if ( !xrtNetPostInit(&Post) ||
!xrtNetPost(pWorker0, &Post,
exampleSimpleTask, (ptr)&bTaskDone) ) {
goto Cleanup;
}
xrtNetEngineConfigInit函数
初始化兼顾吞吐与内存占用的 Engine 默认配置(见上表)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 非空 | 接收默认配置 |
| 返回 | 含义 |
|---|---|
| 无 | 纯初始化,不失败 |
范例已编译验证
network/engine_tour · 生命周期 · 覆盖 Worker 数后创建
xrtNetEngineConfigInit(&Config); Config.Workers = 2; pEngine = xrtNetEngineCreate(&Config);
xrtNetEngineCreate函数
创建停止状态的 Engine;Worker 线程和端口在 Start 时建立。BufferPool 指向的配置在返回前完整复制。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输入 | 非空 | 通常为 ConfigInit 产物;字段越界(如 Workers > 256、EventBatch > 4096)立即失败 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 停止状态的 Engine | — |
NULL | 配置非法或内存不足 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT+XNET_ERROR_ENGINE_CREATE— 配置指针为空或字段非法- 内存分配失败 — Engine 结构或初始表分配失败
范例已编译验证
network/engine_tour · 生命周期 · 创建即 STOPPED
pEngine = xrtNetEngineCreate(&Config);
if ( (pEngine == NULL) ||
(xrtNetEngineState(pEngine) != XNET_ENGINE_STOPPED) ||
!xrtNetEngineStart(pEngine) ) {
goto Cleanup;
}
xrtNetEngineStart函数
建立全部 Worker、端口和线程;已经运行时幂等成功。部分启动失败会完整回滚到 STOPPED,允许重试。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | 停止或运行状态的 Engine |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已运行(或原本已运行) | — |
false | 参数非法、状态切换冲突或资源创建失败;失败后回到 STOPPED | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pEngine为空XERR_STATE+XNET_ERROR_ENGINE_START— 状态正在切换(并发 Start/Stop)XERR_INTERNAL+XNET_ERROR_ENGINE_START— Worker 端口、线程或缓冲池创建失败(含底层端口错误传播)
范例已编译验证
network/engine_tour · 生命周期 · Start 后自旋到 RUNNING
!xrtNetEngineStart(pEngine) ) {
goto Cleanup;
}
while ( xrtNetEngineState(pEngine) != XNET_ENGINE_RUNNING ) {
xrtSleep(1u);
}
xrtNetEngineStop函数
排空任务并释放运行资源。任务链不收敛或仍有外借池块时返回失败,但 Engine 仍进入可重启的停止状态。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | 运行或停止状态的 Engine |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已排空并停止;可再次 Start | — |
false | 已进入 STOPPED 但排空不完整(见错误) | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pEngine为空XERR_STATE+XNET_ERROR_ENGINE_STOP— 从 Worker 回调内调用(自等待死锁),或状态正在切换XERR_STATE+XNET_ERROR_ENGINE_STOP— 任务链不收敛触发封口(ShutdownStalls计数)XNET_ERROR_POOL_BUSY— Worker 缓冲池仍有外借块;池和 Engine 保留,可Start后归还再Stop
范例已编译验证
network/engine_tour · 收尾 · 先停再销毁
(xrtNetEngineState(pEngine) != XNET_ENGINE_STOPPED) ) {
xrtNetEngineStop(pEngine);
}
xrtNetEngineDestroy函数
停止并销毁 Engine;仍有高层对象或外借池块时失败并保留对象。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 允许空指针 | 空指针是空操作;运行中会先执行停止流程 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | Engine 已销毁 | — |
false | 仍有活动对象或外借池块,Engine 保留 | 错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_ENGINE_STOP— 从 Worker 回调内调用XERR_STATE+XNET_ERROR_ENGINE_STOP— 状态正在切换或仍有活动网络对象XNET_ERROR_POOL_BUSY— 缓冲池仍有外借块
范例已编译验证
network/engine_tour · 收尾 · Stop 之后再 Destroy
if ( pEngine != NULL ) {
xrtNetEngineDestroy(pEngine);
}
xrtNetEngineState函数
返回当前生命周期状态,可安全跨线程查询。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 允许空指针 | 空指针返回 XNET_ENGINE_STOPPED(零值) |
| 返回 | 含义 |
|---|---|
XNET_ENGINE_STOPPED | 停止(或空指针);可 Start |
XNET_ENGINE_STARTING | 正在建立 Worker |
XNET_ENGINE_RUNNING | 运行中 |
XNET_ENGINE_STOPPING | 正在排空停机 |
XNET_ENGINE_DESTROYING | 正在销毁 |
范例已编译验证
network/engine_tour · 生命周期 · 自旋等待进入运行态
while ( xrtNetEngineState(pEngine) != XNET_ENGINE_RUNNING ) {
xrtSleep(1u);
}
xrtNetEnginePin函数
占用一个正在运行的 Engine 生命周期,供组合网络对象保存借用指针。每次成功占用必须由一次 xrtNetEngineUnpin 配对释放。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | 必须处于 RUNNING |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 生命周期占用 +1,Destroy 被阻止 | — |
false | 未占用 | 错误经 xrtGetError() 报告 |
XERR_CLOSED+XNET_ERROR_ENGINE_POST— Engine 未运行(Pin 只对运行中的 Engine 有意义)
范例已编译验证
network/engine_tour · 占用 · Pin/Unpin 严格配对
if ( !xrtNetEnginePin(pEngine) ||
!xrtNetEngineUnpin(pEngine) ) {
goto Cleanup;
}
xrtNetEngineUnpin函数
释放一次 Engine 生命周期占用;没有匹配占用时返回状态错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | 必须有未释放的 Pin |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 占用 -1;归零后 Destroy 可继续 | — |
false | 参数非法或没有匹配占用 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pEngine为空XERR_STATE— 没有匹配的 Pin 占用
范例已编译验证
network/engine_tour · 占用 · Pin/Unpin 严格配对
if ( !xrtNetEnginePin(pEngine) ||
!xrtNetEngineUnpin(pEngine) ) {
goto Cleanup;
}
xrtNetEngineWorkerCount函数
返回 Engine 固定的 Worker 数量。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 允许空指针 | 空指针返回 0 |
| 返回 | 含义 |
|---|---|
> 0 | Worker 数;创建后固定,跨 Stop/Start 不变 |
0 | pEngine 为空 |
范例已编译验证
network/engine_tour · 生命周期 · 显式 2 Worker
if ( (xrtNetEngineWorkerCount(pEngine) != 2u) || ((pWorker0 = xrtNetEngineWorker(pEngine, 0u)) == NULL) ||
xrtNetEngineWorker函数
返回借用的指定 Worker;索引越界时返回空指针。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | Engine 指针 |
iIndex | 输入 | < WorkerCount | Worker 索引 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 借用 Worker,存活期由 Engine 决定 | — |
NULL | 索引越界 | XERR_RANGE(越界时设置) |
XERR_RANGE—iIndex >= WorkerCount
范例已编译验证
network/engine_tour · 生命周期 · 越界索引返回空
((pWorker0 = xrtNetEngineWorker(pEngine, 0u)) == NULL) || ((pWorker1 = xrtNetEngineWorker(pEngine, 1u)) == NULL) || (xrtNetEngineWorker(pEngine, 99u) != NULL) ||
xrtNetEngineCurrent函数
返回当前线程所属的借用 Worker,不属于该 Engine 时返回空指针。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 允许空指针 | 空指针返回 NULL |
| 返回 | 含义 |
|---|---|
| 非空 | 当前线程正是该 Worker(在其回调内调用) |
NULL | 当前线程不属于该 Engine(如外部主线程) |
- 无 — 不属于任何 Worker 是查询结果而非错误,不设置线程错误
范例已编译验证
network/engine_tour · 生命周期 · 主线程不属于任何 Worker
(xrtNetEngineWorker(pEngine, 99u) != NULL) ||
/* 主线程不属于任何 Worker → Current 为空。 */
(xrtNetEngineCurrent(pEngine) != NULL) ) {
goto Cleanup;
}
xrtNetWorkerEngine函数
返回 Worker 所属的借用 Engine。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 允许空指针 | 空指针返回 NULL |
| 返回 | 含义 |
|---|---|
| 非空 | 所属 Engine(借用) |
NULL | pWorker 为空 |
- 无 — 空指针返回
NULL,不设置线程错误
范例已编译验证
network/engine_tour · Worker 自省 · 回调内反查 Engine
pTask->bEngineOk = (xrtNetWorkerEngine(pWorker) == pTask->pEngine);
xrtNetWorkerIndex函数
返回 Worker 在所属 Engine 内的稳定索引。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | Worker 指针 |
| 返回 | 含义 |
|---|---|
[0, WorkerCount) | 稳定索引,跨 Stop/Start 不变 |
UINT32_MAX | pWorker 为空 |
XERR_ARGUMENT—pWorker为空(返回UINT32_MAX)
范例已编译验证
network/engine_tour · Worker 自省 · 回调内核对亲和索引
pTask->bIndexOk = (xrtNetWorkerIndex(pWorker) == 0u);
xrtNetWorkerIsCurrent函数
判断调用线程是否正是指定 Worker。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 允许空指针 | 空指针返回 false |
| 返回 | 含义 |
|---|---|
true | 当前线程正是该 Worker |
false | 不是,或 pWorker 为空 |
- 无 — 否定回答与空指针都是查询结果,不设置线程错误
范例已编译验证
network/engine_tour · Worker 自省 · 回调内确认自身
pTask->bIsCurrent = xrtNetWorkerIsCurrent(pWorker);
xrtNetWorkerPort函数
返回运行期间借用的端口;调用方必须保证借用操作先于 Stop 结束。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | 运行中的 Worker |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 借用端口;除跨线程明确允许的操作外应在所属 Worker 使用 | — |
NULL | Worker 未运行 | XERR_STATE(未运行时设置) |
XERR_STATE+XNET_ERROR_ENGINE_POST— Worker 未运行(Stop 后端口已释放)
范例已编译验证
network/engine_tour · Worker 自省 · 回调内取端口
pTask->bPortOk = (xrtNetWorkerPort(pWorker) != NULL);
xrtNetWorkerBufPool函数
返回 Worker 独占的自适应缓冲池;只能从该 Worker 的回调中调用。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | 目标 Worker |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 借用缓冲池;池块必须在所属 Worker 上归还 | — |
NULL | 参数非法或不在该 Worker 回调内 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pWorker为空XERR_STATE+XNET_ERROR_ENGINE_POST— 不在所属 Worker 上调用(缓冲池仅 Worker 内可用)
范例已编译验证
network/engine_tour · Worker 自省 · 只在本 Worker 回调内可用
/* BufPool 只能从本 Worker 回调内调用。 */ pPool = xrtNetWorkerBufPool(pWorker); pTask->bBufPoolOk = (pPool != NULL);
xrtNetWorkerAlloc函数
从 Worker 的线程安全分级缓存分配并清零一块内存;调用方必须保持 Worker 生命周期有效。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | 分配归属的 Worker;归还也须同一 Worker |
iSize | 输入 | > 0 | 请求字节数;按 64–1024 尺寸类圆整,更大直接堆分配 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 已清零的内存块 | — |
NULL | 参数非法或内存不足 | 参数非法时错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pWorker为空或iSize为零- 内存分配失败 — 缓存未命中且堆分配失败
范例已编译验证
network/engine_tour · Worker 自省 · 分配即清零,配对归还
pBlock = xrtNetWorkerAlloc(pWorker, 32u); pTask->bAllocOk = (pBlock != NULL) && (((const uint8*)pBlock)[0] == 0u) && (((const uint8*)pBlock)[31] == 0u); xrtNetWorkerFree(pWorker, pBlock, 32u);
xrtNetWorkerFree函数
把 Worker 分配的内存归还同一 Worker;空指针可以直接释放。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | 必须与分配时的 Worker 相同 |
pMemory | 输入 | 允许空指针 | Alloc 返回的块;空指针为空操作 |
iSize | 输入 | 同分配时 | 必须传回原始请求大小 |
| 返回 | 含义 |
|---|---|
| 无 | 小节点回缓存,大节点直接释放 |
范例已编译验证
network/engine_tour · Worker 自省 · 原始大小配对归还
xrtNetWorkerFree(pWorker, pBlock, 32u); pTask->bFreeOk = true;
xrtNetWorkerOperationId函数
分配 Engine 内唯一的非零端口操作 ID,可从任意线程调用。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | 任意 Worker;ID 空间按 Engine 全局划分 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非零 | Engine 内唯一 ID,可直接作端口操作 Id | — |
0 | 参数非法或 ID 空间耗尽 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pWorker为空XERR_INTERNAL+XNET_ERROR_ENGINE_POST— 64 位 ID 空间耗尽(实际不可达)
范例已编译验证
network/engine_tour · 占用 · 不同 Worker 的 ID 互不相同
IdOpA = xrtNetWorkerOperationId(pWorker0);
IdOpB = xrtNetWorkerOperationId(pWorker1);
if ( (IdOpA == 0u) || (IdOpB == 0u) || (IdOpA == IdOpB) ) {
goto Cleanup;
}
xrtNetEnginePost函数
有界投递任务;成功受理后必在亲和 Worker(iAffinity % Workers)上执行一次。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | 运行中的 Engine |
iAffinity | 输入 | 任意值 | 亲和键;按模 Worker 数选目标 |
pProc | 输入 | 非空 | 任务回调,短小非阻塞 |
pData | 输入 | 任意值 | 原样传给回调 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已受理;含与 Stop 并发时也必执行一次 | — |
false | 未受理,不留任务 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pEngine/pProc为空XERR_CLOSED+XNET_ERROR_ENGINE_POST— Engine 未运行或停机封口已触发XERR_AGAIN— 目标 Worker 命令队列达到CommandCapacityXERR_INTERNAL— Worker 唤醒失败
范例已编译验证
network/engine_tour · 任务 · 投递到 0 号亲和并自旋等待
if ( !xrtNetEnginePost(pEngine, 0u, exampleWorkerTask, (ptr)&Task) || !exampleSpinUntil(&Task.bDone, 2000u) ||
xrtNetEngineSchedule函数
按单调时钟截止时间调度 Timer;成功返回非零 ID。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | 运行中的 Engine |
iAffinity | 输入 | 任意值 | 亲和键;Timer 归属该 Worker |
iTimeout | 输入 | 相对毫秒 | 零表示不等待,XRT_WAIT_FOREVER 表示无限等待 |
pProc | 输入 | 非空 | 终态回调(四种结果见上表) |
pData | 输入 | 任意值 | 原样传给回调 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非零 | Timer ID,Engine 内唯一;恰好一次终态回调 | — |
0 | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pEngine/pProc为空XERR_CLOSED+XNET_ERROR_ENGINE_TIMER— Engine 未运行或停机封口XERR_AGAIN+XNET_ERROR_ENGINE_TIMER— 在途 Timer 数达到TimerLimitXERR_RANGE+XNET_ERROR_ENGINE_TIMER— Timer 表无法表示更多条目XERR_INTERNAL— 跨线程命令入队后唤醒失败
范例已编译验证
network/engine_tour · 定时器 · 即时到期 + 长时定时器
IdFire = xrtNetEngineSchedule(pEngine, 0u, 0, exampleFireTimer, (ptr)&Timers); Timers.iLongId = xrtNetEngineSchedule(pEngine, 0u, 3600000, exampleLongTimer, (ptr)&Timers);
xrtNetEngineAfter函数
按相对毫秒数调度 Timer;零表示在下一次 Worker 循环到期。等价于 Schedule + relative milliseconds,错误集与之相同。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | 运行中的 Engine |
iAffinity | 输入 | 任意值 | 亲和键 |
iTimeout | 输入 | 毫秒 | 相对延迟;零表示尽快到期 |
pProc | 输入 | 非空 | 终态回调 |
pData | 输入 | 任意值 | 原样传给回调 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非零 | Timer ID | — |
0 | 未受理 | 错误经 xrtGetError() 报告 |
- 同
xrtNetEngineSchedule(ARGUMENT/CLOSED/AGAIN/RANGE/INTERNAL)
范例已编译验证
network/engine · 延迟任务 · 100 毫秒后触发
(xrtNetEngineAfter(
pEngine,
1,
100000u,
exampleTimer,
&State
) == 0) ) {
xrtNetEngineTimerCancel函数
异步请求取消 Timer;成功只表示取消命令已进入目标 Worker。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | Timer 所属 Engine |
Id | 输入 | 非零 | Schedule/After 返回的 ID |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 取消请求已入队;最终结果仍由唯一终态回调给出 | — |
false | 请求未入队 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pEngine为空或Id为零XERR_CLOSED+XNET_ERROR_ENGINE_TIMER— Engine 未运行或停机封口XERR_AGAIN— 目标 Worker 命令队列达到容量XERR_INTERNAL— 唤醒失败
范例已编译验证
network/engine_tour · 定时器 · 异步取消长定时器
if ( (IdFire == 0u) || (Timers.iLongId == 0u) ||
!xrtNetEngineTimerCancel(pEngine, Timers.iLongId) ) {
goto Cleanup;
}
xrtNetEngineTimerCancelCurrent函数
只在 Timer 所属 Worker 上立即取消且不分配内存。不在所属 Worker、Timer 尚未入堆或已经终结时返回 false,且不修改线程错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | Timer 所属 Engine |
Id | 输入 | 非零 | 要取消的 Timer ID |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已取消;终态回调以 CANCELLED 触发 | — |
false | 不在所属 Worker、尚未入堆或已终结 | 不修改线程错误 |
- 无 — 失败路径刻意不设置错误(调用方可先试本函数,失败再走
TimerCancel)
范例已编译验证
network/engine_tour · CancelCurrent · 同亲和回调内取消另一个 Timer
pTimers->bCancelCurrentOk = xrtNetEngineTimerCancelCurrent( xrtNetWorkerEngine(pWorker), pTimers->iLongId);
xrtNetCompletionInit函数
初始化一个借用过程和数据的端口 Completion;空指针是空操作,不设置错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCompletion | 输出 | 建议非空 | 调用方拥有的 Completion;空指针是空操作 |
pProc | 输入 | 可空 | 终态回调 Proc(worker, event, data),在所属 Worker 上执行 |
pData | 输入 | 任意值 | 原样传给回调 |
| 返回 | 含义 |
|---|---|
| 无 | 纯初始化;存活期约束见上文 Completion 契约 |
- 无 — 初始化不失败,空指针静默忽略
范例已编译验证
network/engine_tour · Completion · 借用过程与数据的初始化形态
xrtNetCompletionInit(&Completion, exampleCompletionProc, (ptr)&bTaskDone);
xrtNetWorkerStats函数
读取一个 Worker 的统计快照。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pWorker | 输入 | 非空 | 目标 Worker |
pStats | 输出 | 非空 | 接收并发快照 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 快照已写入 | — |
false | 参数非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 任一指针为空
范例已编译验证
network/engine_tour · 统计 · 任务执行后核对计数
if ( !xrtNetWorkerStats(pWorker0, &WorkerStats) ||
(WorkerStats.PostsExecuted < 1u) ) {
goto Cleanup;
}
xrtNetEngineStats函数
聚合全部 Worker 的统计快照。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEngine | 输入 | 非空 | Engine 指针 |
pStats | 输出 | 非空 | 接收聚合快照 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 聚合快照已写入 | — |
false | 参数非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 任一指针为空
范例已编译验证
network/engine_tour · 统计 · 全 Worker 聚合计数
if ( !xrtNetEngineStats(pEngine, &EngineStats) ||
(EngineStats.PostsExecuted < 2u) ||
(EngineStats.TimersFired < 2u) ) {
goto Cleanup;
}
xrtNetResolverConfigInit函数
写入兼顾桌面与高并发服务的默认配置:Workers=2、RequestLimit=8192、QueryLimit=4096、CacheEntries=256、SuccessTTL=60s、FailureTTL=5s、HostLimit=1024。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 建议非空 | 接收默认配置;空指针是空操作 |
| 返回 | 含义 |
|---|---|
| 无 | 纯初始化,不失败 |
范例已编译验证
network/resolve_tour · 创建 · 初始化后直接创建
xrtNetResolverConfigInit(&Config); pResolver = xrtNetResolverCreate(&Config);
xrtNetResolverCreate函数
创建并立即启动独立解析工作池;空配置使用默认值(内部先取默认再整体复制调用方配置)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输入 | 允许空指针 | 空指针用默认值;非空时字段任一上限为零或不支持即失败 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 运行中的 Resolver | — |
NULL | 配置非法或资源不足 | 错误经 xrtGetError() 报告 |
XERR_VALUE+XNET_ERROR_RESOLVER_CREATE— 配置含零值或不支持的限额(如Workers > 32、RequestLimit == 0)- 内存分配失败 — 结构或线程池创建失败
范例已编译验证
network/resolve_tour · 创建 · 默认配置 + 初始统计核对
pResolver = xrtNetResolverCreate(&Config);
if ( (pResolver == NULL) ||
!xrtNetResolverStats(pResolver, &Stats) ||
(Stats.Submitted != 0u) ) {
goto Cleanup;
}
xrtNetResolverDestroy函数
排空已受理请求并等待全部回调;必须与其他 Resolver 所有者操作串行,返回后指针失效。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pResolver | 输入 | 允许空指针 | 空指针是空操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 已排空并销毁 | — |
false | 参数非法、状态非法或回调内部失败 | 错误经 xrtGetError() 报告 |
XERR_STATE+XNET_ERROR_RESOLVER_CLOSED— 从 Resolver 自己的 Worker 回调内调用,或已在关闭/已销毁
范例已编译验证
network/resolve_tour · 收尾 · 销毁失败以退出码暴露
if ( (pResolver != NULL) &&
!xrtNetResolverDestroy(pResolver) ) {
iResult = 2;
}
xrtNetResolverResolve函数
提交主机查询;同一规范化主机与地址族只执行一次底层查询,命中缓存立即返回已关联的 Op。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pResolver | 输入 | 非空 | 运行中的 Resolver |
sHost | 输入 | 非空、以零结尾 | 主机名;长度不得超过 HostLimit |
Family | 输入 | UNSPEC/IPV4/IPV6 | 目标地址族 |
pDone | 输入 | 非空 | 完成回调,在 Resolver Worker 上恰好执行一次 |
pData | 输入 | 任意值 | 原样传给回调 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 解析操作(引用归调用方,用后 ResolveOpDestroy) | — |
NULL | 未受理 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pResolver/sHost/pDone为空XERR_VALUE+XNET_ERROR_FAMILY—Family不是三种支持值之一XERR_CLOSED+XNET_ERROR_RESOLVER_CLOSED— Resolver 已关闭或正在关闭XERR_RANGE+XNET_ERROR_RESOLVER_SUBMIT— 主机名超过HostLimitXERR_AGAIN+XNET_ERROR_RESOLVER_SUBMIT— 在途请求达到RequestLimit,或唯一查询数达到QueryLimit
范例已编译验证
network/resolve_tour · 查询 · 提交 localhost 并核对初始状态
pOperation = xrtNetResolverResolve(pResolver, "localhost", XNET_FAMILY_IPV4, exampleResolveDone, (ptr)&State);
xrtNetResolverClear函数
清空成功和失败缓存;已经运行或排队的查询不受影响。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pResolver | 输入 | 非空 | 运行中的 Resolver |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 缓存已清空 | — |
false | 参数非法或 Resolver 已关闭 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pResolver为空XERR_STATE+XNET_ERROR_RESOLVER_CLOSED— 正在关闭或已销毁
范例已编译验证
network/resolve_tour · 清缓存 · 清空后缓存计数归零
if ( !xrtNetResolverClear(pResolver) ) {
goto Cleanup;
}
xrtNetResolverStats函数
取得 Resolver 的并发一致统计快照。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pResolver | 输入 | 非空 | Resolver 指针 |
pStats | 输出 | 非空 | 接收快照(Submitted/Resolved/CachedResults 等) |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 快照已写入 | — |
false | 参数非法 | 错误经 xrtGetError() 报告 |
XERR_ARGUMENT— 任一指针为空
范例已编译验证
network/resolve_tour · 统计 · 查询后核对计数推进
if ( !xrtNetResolverStats(pResolver, &Stats) ||
(Stats.Submitted < 1u) ||
(Stats.Resolved < 1u) ) {
goto Cleanup;
}
xrtNetResolveOpRef函数
增加解析操作引用并返回原指针。跨线程保留 Op(回调后仍要查询)必须先取引用。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pOperation | 输入 | 非空 | 解析操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 原指针,引用 +1;之后必须多一次 ResolveOpDestroy | — |
NULL | 参数非法或引用耗尽 | 参数非法时错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pOperation为空
范例已编译验证
network/resolve_tour · OpRef · 共享引用后双份销毁
pRef = xrtNetResolveOpRef(pOperation);
if ( (pRef == NULL) || (pRef != pOperation) ) {
goto Cleanup;
}
xrtNetResolveOpDestroy(pRef);
xrtNetResolveOpDestroy(pOperation);
xrtNetResolveOpDestroy函数
释放解析操作引用;空指针视为空操作。归零时释放操作与关联结果。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pOperation | 输入 | 允许空指针 | 要释放引用的操作 |
| 返回 | 含义 |
|---|---|
| 无 | 空指针是空操作 |
范例已编译验证
network/resolve_tour · OpRef · 每份引用各自配对销毁
xrtNetResolveOpDestroy(pRef); xrtNetResolveOpDestroy(pOperation);
xrtNetResolveOpCancel函数
协作取消尚未进入终态的操作;回调仍在 Resolver Worker 上执行一次(以 CANCELLED 终态)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pOperation | 输入 | 非空 | 要取消的操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 取消请求已受理(或查询组已在取消) | — |
false | 参数非法或操作已进入终态 | 参数非法时错误经 xrtGetError() 报告 |
XERR_ARGUMENT—pOperation为空- 无额外错误 — 已终态的取消失败是查询结果,不设置错误
范例已编译验证
network/resolver · 超时取消 · 等待截止后协作取消
if ( (xrtTimer() >= iDeadline) ) {
(void)xrtNetResolveOpCancel(pOperation);
break;
}
xrtNetResolveOpState函数
返回解析操作当前状态的原子快照。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pOperation | 输入 | 非空 | 解析操作 |
| 返回 | 含义 |
|---|---|
XNET_RESOLVE_PENDING | 已受理、尚未开始底层查询 |
XNET_RESOLVE_RUNNING | 底层查询进行中 |
XNET_RESOLVE_RESOLVED | 成功终态(结果可取) |
XNET_RESOLVE_FAILED | 失败终态(错误可借) |
XNET_RESOLVE_CANCELLED | 取消终态 |
范例已编译验证
network/resolve_tour · 状态机 · 提交时未完成、回调后已解析
if ( (pOperation == NULL) ||
(xrtNetResolveOpState(pOperation) ==
XNET_RESOLVE_RESOLVED) ) {
goto Cleanup;
}
xrtNetResolveOpResult函数
成功时返回增加引用的完整地址列表,其他状态返回空指针并设置对应错误。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pOperation | 输入 | 非空 | 解析操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 地址列表(引用 +1,调用方 xrtNetAddrListDestroy) | — |
NULL | 未终态或非成功终态 | 错误经 xrtGetError() 报告;失败详情另见 ResolveOpError |
XERR_ARGUMENT—pOperation为空XERR_VALUE+XNET_ERROR_RESOLVER_QUERY— 操作尚未完成(终态前查询结果)- 失败/取消状态 —
NULL,结构化错误经ResolveOpError借用返回
范例已编译验证
network/resolve_tour · 结果 · 返回的列表由调用方销毁
pList = xrtNetResolveOpResult(pOperation);
if ( (pList == NULL) ||
(xrtNetAddrListCount(pList) < 1u) ) {
goto Cleanup;
}
xrtNetAddrListDestroy(pList);
xrtNetResolveOpError函数
失败或取消时返回借用的结构化错误,其他状态返回空指针。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pOperation | 输入 | 非空 | 解析操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 借用的 xerror,存活到操作销毁;不转移所有权 | — |
NULL | 非失败/取消状态 | 非错误状态,不设置线程错误 |
- 无 — 空返回是状态查询结果而非错误
范例已编译验证
network/resolver · 失败路径 · 借用错误打印消息
const xerror* pError = xrtNetResolveOpError(pOperation); fprintf(stderr, "%s\n", pError != NULL ? xrtErrorMessage(pError) : "resolve failed");
xrtNetResolveAsync函数
把 Resolver 查询包装为 Future;成功值是由 Future 持有的地址列表。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pResolver | 输入 | 非空 | 运行中的 Resolver |
sHost | 输入 | 非空 | 主机名 |
Family | 输入 | 三种支持值 | 目标地址族 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | Future:成功值 xnetaddrlist*(Future 持有),失败值 xerror | — |
NULL | 提交失败(同 ResolverResolve)或 Future 分配失败 | 错误经 xrtGetError() 报告 |
- 同
xrtNetResolverResolve(ARGUMENT/VALUE/CLOSED/RANGE/AGAIN) - 内存分配失败 — Future 包装失败
范例已编译验证
network/resolver_future · Future 形态 · 提交后 xrtFutureWaitFor 等待
pFuture = xrtNetResolveAsync( pResolver, "localhost", XNET_FAMILY_UNSPEC );
xrtNetAddrListOwnership函数
契约注释见公共头文件。
xrtNetAddrListOwnershipAdapterV1函数
契约注释见公共头文件。
xrtNetResolverCreateOwnedV1函数
契约注释见公共头文件。
xrtNetResolverTryDestroy函数
契约注释见公共头文件。
xrtNetResolverResolveOwnedV1函数
契约注释见公共头文件。
xrtNetResolverOwnership函数
契约注释见公共头文件。
xrtNetResolveOpOwnership函数
契约注释见公共头文件。
xrtNetResolverOwnershipAdapterV1函数
契约注释见公共头文件。
xrtNetResolveOpOwnershipAdapterV1函数
契约注释见公共头文件。
xrtNetResolverFutureProducerPolicyV1Get函数
契约注释见公共头文件。
xrtNetResolverFutureCancelPolicyV1Get函数
契约注释见公共头文件。
xrtNetResolverFutureRequestPolicyV1Get函数
契约注释见公共头文件。
xrtNetResolverFuturePayloadPolicyV1Get函数
契约注释见公共头文件。
xrtNetResolverFutureOwnershipAdapterV1函数
契约注释见公共头文件。
xrtNetEngineOwnership函数
契约注释见公共头文件。
xrtNetEngineOwnershipAdapterV1函数
契约注释见公共头文件。
xrtNetEnginePostOwnedV1函数
契约注释见公共头文件。
xrtNetEngineScheduleOwnedV1函数
契约注释见公共头文件。
xrtNetEngineTryDestroy函数
契约注释见公共头文件。
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
|---|---|
| XNET_BUFFER_CLASS_COUNT | 见头文件注释 |
| XNET_DGRAM_BATCH_MAX | 见头文件注释 |
| XNET_DGRAM_CAP_ERROR_QUEUE | 见头文件注释 |
| XNET_DGRAM_CAP_PATH_MTU_MODE | 见头文件注释 |
| XNET_DGRAM_CAP_PATH_MTU_QUERY | 见头文件注释 |
| XNET_DGRAM_CAP_SEGMENT_RECEIVE | 见头文件注释 |
| XNET_DGRAM_CAP_SEGMENT_SEND | 见头文件注释 |
| XNET_DGRAM_CONTROL_HOP_LIMIT | 见头文件注释 |
| XNET_DGRAM_CONTROL_INTERFACE | 见头文件注释 |
| XNET_DGRAM_CONTROL_SEGMENT_SIZE | 见头文件注释 |
| XNET_DGRAM_CONTROL_SOURCE | 见头文件注释 |
| XNET_DGRAM_CONTROL_TRAFFIC_CLASS | 见头文件注释 |
| XNET_DGRAM_ERROR_ICMP | 见头文件注释 |
| XNET_DGRAM_ERROR_ICMP6 | 见头文件注释 |
| XNET_DGRAM_ERROR_LOCAL | 见头文件注释 |
| XNET_DGRAM_ERROR_META_TRUNCATED | 见头文件注释 |
| XNET_DGRAM_ERROR_OFFENDER | 见头文件注释 |
| XNET_DGRAM_ERROR_PATH_MTU | 见头文件注释 |
| XNET_DGRAM_ERROR_PAYLOAD_TRUNCATED | 见头文件注释 |
| XNET_DGRAM_ERROR_REMOTE | 见头文件注释 |
| XNET_DGRAM_ERROR_UNKNOWN | 见头文件注释 |
| XNET_DGRAM_META_DESTINATION | 见头文件注释 |
| XNET_DGRAM_META_HOP_LIMIT | 见头文件注释 |
| XNET_DGRAM_META_INTERFACE | 见头文件注释 |
| XNET_DGRAM_META_SEGMENT_SIZE | 见头文件注释 |
| XNET_DGRAM_META_TRAFFIC_CLASS | 见头文件注释 |
| XNET_DGRAM_META_TRUNCATED | 见头文件注释 |
| XNET_ENGINE_DESTROYING | 见头文件注释 |
| XNET_ENGINE_RUNNING | 见头文件注释 |
| XNET_ENGINE_STARTING | 见头文件注释 |
| XNET_ENGINE_STOPPED | 见头文件注释 |
| XNET_ENGINE_STOPPING | 见头文件注释 |
| XNET_ERROR_BUFFER | 见头文件注释 |
| XNET_ERROR_BUFFER_STATE | 见头文件注释 |
| XNET_ERROR_DIAL_CONFIG | 见头文件注释 |
| XNET_ERROR_DIAL_CONNECT | 见头文件注释 |
| XNET_ERROR_DIAL_CREATE | 见头文件注释 |
| XNET_ERROR_DIAL_RESOLVE | 见头文件注释 |
| XNET_ERROR_DNS_RESOLVE | 见头文件注释 |
| XNET_ERROR_DNS_RESULT | 见头文件注释 |
| XNET_ERROR_DNS_REVERSE | 见头文件注释 |
| XNET_ERROR_ENGINE_CREATE | 见头文件注释 |
| XNET_ERROR_ENGINE_POST | 见头文件注释 |
| XNET_ERROR_ENGINE_START | 见头文件注释 |
| XNET_ERROR_ENGINE_STOP | 见头文件注释 |
| XNET_ERROR_ENGINE_TIMER | 见头文件注释 |
| XNET_ERROR_FAMILY | 见头文件注释 |
| XNET_ERROR_FORMAT | 见头文件注释 |
| XNET_ERROR_FRAME_CONFIG | 见头文件注释 |
| XNET_ERROR_FRAME_LENGTH | 见头文件注释 |
| XNET_ERROR_FRAME_LIMIT | 见头文件注释 |
| XNET_ERROR_FRAME_STATE | 见头文件注释 |
| XNET_ERROR_HOST_NAME | 见头文件注释 |
| XNET_ERROR_INTERFACE_ADDRESS | 见头文件注释 |
| XNET_ERROR_INTERFACE_HARDWARE | 见头文件注释 |
| XNET_ERROR_INTERFACE_INDEX | 见头文件注释 |
| XNET_ERROR_INTERFACE_NAME | 见头文件注释 |
| XNET_ERROR_INTERFACE_QUERY | 见头文件注释 |
| XNET_ERROR_LISTENER_ACCEPT | 见头文件注释 |
| XNET_ERROR_LISTENER_CLOSE | 见头文件注释 |
| XNET_ERROR_LISTENER_CREATE | 见头文件注释 |
| XNET_ERROR_NATIVE | 见头文件注释 |
| XNET_ERROR_NONE | 见头文件注释 |
| XNET_ERROR_POOL_BUSY | 见头文件注释 |
| XNET_ERROR_PORT | 见头文件注释 |
| XNET_ERROR_PORT_CANCEL | 见头文件注释 |
| XNET_ERROR_PORT_CLOSE | 见头文件注释 |
| XNET_ERROR_PORT_CREATE | 见头文件注释 |
| XNET_ERROR_PORT_POST | 见头文件注释 |
| XNET_ERROR_PORT_SUBMIT | 见头文件注释 |
| XNET_ERROR_PORT_WAIT | 见头文件注释 |
| XNET_ERROR_PORT_WATCH | 见头文件注释 |
| XNET_ERROR_PROXY_AUTH | 见头文件注释 |
| XNET_ERROR_PROXY_CONFIG | 见头文件注释 |
| XNET_ERROR_PROXY_CONNECT | 见头文件注释 |
| XNET_ERROR_PROXY_CREATE | 见头文件注释 |
| XNET_ERROR_PROXY_LIMIT | 见头文件注释 |
| XNET_ERROR_PROXY_PROTOCOL | 见头文件注释 |
| XNET_ERROR_PROXY_UNSUPPORTED | 见头文件注释 |
| XNET_ERROR_RESOLVER_CLOSED | 见头文件注释 |
| XNET_ERROR_RESOLVER_CREATE | 见头文件注释 |
| XNET_ERROR_RESOLVER_QUERY | 见头文件注释 |
| XNET_ERROR_RESOLVER_SUBMIT | 见头文件注释 |
| XNET_ERROR_SCOPE | 见头文件注释 |
| XNET_ERROR_SERVER_ACCEPT | 见头文件注释 |
| XNET_ERROR_SERVER_CONFIG | 见头文件注释 |
| XNET_ERROR_SERVER_START | 见头文件注释 |
| XNET_ERROR_SOCKET_ACCEPT | 见头文件注释 |
| XNET_ERROR_SOCKET_BIND | 见头文件注释 |
| XNET_ERROR_SOCKET_CLOSE | 见头文件注释 |
| XNET_ERROR_SOCKET_CONNECT | 见头文件注释 |
| XNET_ERROR_SOCKET_DGRAM_ERROR | 见头文件注释 |
| XNET_ERROR_SOCKET_LISTEN | 见头文件注释 |
| XNET_ERROR_SOCKET_OPEN | 见头文件注释 |
| XNET_ERROR_SOCKET_OPTION | 见头文件注释 |
| XNET_ERROR_SOCKET_READ | 见头文件注释 |
| XNET_ERROR_SOCKET_SHUTDOWN | 见头文件注释 |
| XNET_ERROR_SOCKET_WRITE | 见头文件注释 |
| XNET_ERROR_STREAM_CLOSE | 见头文件注释 |
| XNET_ERROR_STREAM_CONFIG | 见头文件注释 |
| XNET_ERROR_STREAM_CONNECT | 见头文件注释 |
| XNET_ERROR_STREAM_CREATE | 见头文件注释 |
| XNET_ERROR_STREAM_READ | 见头文件注释 |
| XNET_ERROR_STREAM_WRITE | 见头文件注释 |
| XNET_ERROR_SYSTEM | 见头文件注释 |
| XNET_ERROR_UDP_CLOSE | 见头文件注释 |
| XNET_ERROR_UDP_CONFIG | 见头文件注释 |
| XNET_ERROR_UDP_CREATE | 见头文件注释 |
| XNET_ERROR_UDP_RECEIVE | 见头文件注释 |
| XNET_ERROR_UDP_RECEIVE_QUEUE | 见头文件注释 |
| XNET_ERROR_UDP_SEND | 见头文件注释 |
| XNET_FAMILY_IPV4 | 见头文件注释 |
| XNET_FAMILY_IPV6 | 见头文件注释 |
| XNET_FAMILY_UNSPEC | 见头文件注释 |
| XNET_OPTION_BROADCAST | 见头文件注释 |
| XNET_OPTION_DGRAM_ERRORS | 见头文件注释 |
| XNET_OPTION_ERROR | 见头文件注释 |
| XNET_OPTION_EXCLUSIVE_ADDRESS | 见头文件注释 |
| XNET_OPTION_HOP_LIMIT | 见头文件注释 |
| XNET_OPTION_IPV6_ONLY | 见头文件注释 |
| XNET_OPTION_KEEP_ALIVE | 见头文件注释 |
| XNET_OPTION_LINGER | 见头文件注释 |
| XNET_OPTION_NONBLOCK | 见头文件注释 |
| XNET_OPTION_NO_DELAY | 见头文件注释 |
| XNET_OPTION_PATH_MTU | 见头文件注释 |
| XNET_OPTION_PATH_MTU_MODE | 见头文件注释 |
| XNET_OPTION_RECEIVE_BUFFER | 见头文件注释 |
| XNET_OPTION_REUSE_ADDRESS | 见头文件注释 |
| XNET_OPTION_REUSE_PORT | 见头文件注释 |
| XNET_OPTION_SEND_BUFFER | 见头文件注释 |
| XNET_OPTION_TRAFFIC_CLASS | 见头文件注释 |
| XNET_PMTU_DISCOVER | 见头文件注释 |
| XNET_PMTU_FRAGMENT | 见头文件注释 |
| XNET_PMTU_PROBE | 见头文件注释 |
| XNET_PMTU_SYSTEM | 见头文件注释 |
| XNET_POLL_READ | 见头文件注释 |
| XNET_POLL_WRITE | 见头文件注释 |
| XNET_PORT_AUTO | 见头文件注释 |
| XNET_PORT_CAP_BATCH | 见头文件注释 |
| XNET_PORT_CAP_CANCEL | 见头文件注释 |
| XNET_PORT_CAP_COMPLETION | 见头文件注释 |
| XNET_PORT_CAP_DGRAM_ERROR | 见头文件注释 |
| XNET_PORT_CAP_EDGE | 见头文件注释 |
| XNET_PORT_CAP_FILE_IO | 见头文件注释 |
| XNET_PORT_CAP_ONESHOT | 见头文件注释 |
| XNET_PORT_CAP_POST | 见头文件注释 |
| XNET_PORT_CAP_READINESS | 见头文件注释 |
| XNET_PORT_CAP_READ_PROBE | 见头文件注释 |
| XNET_PORT_CAP_SEND_FILE | 见头文件注释 |
| XNET_PORT_CAP_WAKE | 见头文件注释 |
| XNET_PORT_EPOLL | 见头文件注释 |
| XNET_PORT_EVENT_ACCEPT | 见头文件注释 |
| XNET_PORT_EVENT_CONNECT | 见头文件注释 |
| XNET_PORT_EVENT_EOF | 见头文件注释 |
| XNET_PORT_EVENT_ERROR | 见头文件注释 |
| XNET_PORT_EVENT_FILE_READ | 见头文件注释 |
| XNET_PORT_EVENT_FILE_WRITE | 见头文件注释 |
| XNET_PORT_EVENT_HANGUP | 见头文件注释 |
| XNET_PORT_EVENT_MORE | 见头文件注释 |
| XNET_PORT_EVENT_READ | 见头文件注释 |
| XNET_PORT_EVENT_READY | 见头文件注释 |
| XNET_PORT_EVENT_READ_PROBE | 见头文件注释 |
| XNET_PORT_EVENT_RECV | 见头文件注释 |
| XNET_PORT_EVENT_RECV_ERROR | 见头文件注释 |
| XNET_PORT_EVENT_RECV_FROM | 见头文件注释 |
| XNET_PORT_EVENT_RECV_MSG | 见头文件注释 |
| XNET_PORT_EVENT_SEND | 见头文件注释 |
| XNET_PORT_EVENT_SEND_FILE | 见头文件注释 |
| XNET_PORT_EVENT_SEND_MSG | 见头文件注释 |
| XNET_PORT_EVENT_SEND_TO | 见头文件注释 |
| XNET_PORT_EVENT_USER | 见头文件注释 |
| XNET_PORT_EVENT_WAKE | 见头文件注释 |
| XNET_PORT_EVENT_WRITE | 见头文件注释 |
| XNET_PORT_IOCP | 见头文件注释 |
| XNET_PORT_KQUEUE | 见头文件注释 |
| XNET_PORT_SELECT | 见头文件注释 |
| XNET_PORT_URING | 见头文件注释 |
| XNET_POST_STORAGE_SIZE | 见头文件注释 |
| XNET_RESOLVE_CANCELLED | 见头文件注释 |
| XNET_RESOLVE_FAILED | 见头文件注释 |
| XNET_RESOLVE_PENDING | 见头文件注释 |
| XNET_RESOLVE_RESOLVED | 见头文件注释 |
| XNET_RESOLVE_RUNNING | 见头文件注释 |
| XNET_RESULT_AGAIN | 见头文件注释 |
| XNET_RESULT_CANCELLED | 见头文件注释 |
| XNET_RESULT_CLOSED | 见头文件注释 |
| XNET_RESULT_ERROR | 见头文件注释 |
| XNET_RESULT_OK | 见头文件注释 |
| XNET_RESULT_TIMEOUT | 见头文件注释 |
| XNET_RESULT_TRUNCATED | 见头文件注释 |
| XNET_RETIRE_BUSY | 见头文件注释 |
| XNET_RETIRE_ERROR | 见头文件注释 |
| XNET_RETIRE_READY | 见头文件注释 |
| XNET_SHUTDOWN_BOTH | 见头文件注释 |
| XNET_SHUTDOWN_READ | 见头文件注释 |
| XNET_SHUTDOWN_WRITE | 见头文件注释 |
| XNET_SOCKET_DGRAM | 见头文件注释 |
| XNET_SOCKET_NONBLOCK | 见头文件注释 |
| XNET_SOCKET_STREAM | 见头文件注释 |
| XNET_STATS_BASIC | 见头文件注释 |
| XNET_STATS_FULL | 见头文件注释 |
| XNET_STATS_OFF | 见头文件注释 |
| XRT_NET_STATS_LEVEL | 见头文件注释 |