模块契约网络地址基础 API

错误

  • XERR_ARGUMENT — pAddr == NULL 或 Family 非法

网络错误域是 xrt.net,稳定代码为:

代码含义
XNET_ERROR_NONE没有网络错误;用于统计快照等非失败状态
XNET_ERROR_FORMAT数字地址或端点语法错误
XNET_ERROR_FAMILY地址族不受支持
XNET_ERROR_PORT端口为空、非十进制或越界
XNET_ERROR_SCOPEIPv6 Scope 非法或越界
XNET_ERROR_BUFFER文本或 native 输出缓冲不足
XNET_ERROR_NATIVE平台地址结构截断或不支持
XNET_ERROR_SYSTEM平台网络运行时失败
XNET_ERROR_DNS_RESOLVE正向 DNS 解析失败
XNET_ERROR_DNS_REVERSE反向 DNS 解析失败
XNET_ERROR_DNS_RESULTDNS 结果索引、地址族或输出非法
XNET_ERROR_RESOLVER_CREATE异步 Resolver 配置或创建失败
XNET_ERROR_RESOLVER_SUBMITResolver 请求非法、超限或提交失败
XNET_ERROR_RESOLVER_CLOSEDResolver 已关闭或关闭过程失败
XNET_ERROR_RESOLVER_QUERYResolver 后台查询失败
XNET_ERROR_BUFFER_STATE缓冲预留、池配置或修改状态非法
XNET_ERROR_POOL_BUSY缓冲池仍有实时块,不能销毁
XNET_ERROR_SOCKET_OPEN创建或初始化 Socket 失败
XNET_ERROR_SOCKET_CLOSE关闭 Socket 失败;对象仍立即失效
XNET_ERROR_SOCKET_OPTIONSocket 选项非法、不支持或系统操作失败
XNET_ERROR_SOCKET_BINDSocket 绑定失败
XNET_ERROR_SOCKET_LISTENSocket 监听失败
XNET_ERROR_SOCKET_ACCEPT接受连接失败
XNET_ERROR_SOCKET_CONNECT发起或完成连接失败
XNET_ERROR_SOCKET_SHUTDOWN半关闭失败
XNET_ERROR_SOCKET_READSocket 接收失败
XNET_ERROR_SOCKET_WRITESocket 发送失败
XNET_ERROR_PORT_CREATE事件端口配置、后端选择或初始化失败
XNET_ERROR_PORT_CLOSE事件端口资源关闭失败
XNET_ERROR_PORT_WATCHreadiness 观察非法、超限或后端不支持
XNET_ERROR_PORT_WAIT事件等待参数或平台调用失败
XNET_ERROR_PORT_POST用户事件队列满、投递或唤醒失败
XNET_ERROR_PORT_SUBMIT完成式 IO 提交失败
XNET_ERROR_PORT_CANCEL完成式 IO 取消失败
XNET_ERROR_ENGINE_CREATEEngine 配置、Worker 或资源创建失败
XNET_ERROR_ENGINE_STARTEngine 启动失败
XNET_ERROR_ENGINE_STOPEngine 停止或对象排空失败
XNET_ERROR_ENGINE_POSTWorker 命令投递失败
XNET_ERROR_ENGINE_TIMER定时器参数、容量或操作失败
XNET_ERROR_STREAM_CONFIGTCP Stream 配置或 Worker 限定操作非法
XNET_ERROR_STREAM_CREATETCP Stream 创建失败
XNET_ERROR_STREAM_CONNECTTCP Stream 异步连接失败
XNET_ERROR_STREAM_READTCP Stream 读取、缓冲或协议消费失败
XNET_ERROR_STREAM_WRITETCP Stream 发送或写半关闭失败
XNET_ERROR_STREAM_CLOSETCP Stream 关闭失败
XNET_ERROR_LISTENER_CREATETCP Listener 配置或创建失败
XNET_ERROR_LISTENER_ACCEPTTCP Listener 接受或分发失败
XNET_ERROR_LISTENER_CLOSETCP 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_IPV4IPv4
XNET_FAMILY_IPV6IPv6
typedef enum xnetfamily { XNET_FAMILY_UNSPEC = 0, XNET_FAMILY_IPV4 = 4, XNET_FAMILY_IPV6 = 6 } xnetfamily;

xnetaddr类型

端口使用主机字节序,地址字节始终使用网络字节序。

字段类型语义
Familyuint16地址族
Portuint16端口
Scopeuint32作用域标识
typedef struct xnetaddr { uint16 Family; uint16 Port; uint32 Scope; uint8 Address[16]; } xnetaddr;

xnetresult类型

网络操作把正常控制结果与结构化错误分开表达。

值语义
XNET_RESULT_ERROR失败
XNET_RESULT_OK成功
XNET_RESULT_AGAIN暂不可推进
XNET_RESULT_CLOSED已关闭
XNET_RESULT_TRUNCATED已截断
XNET_RESULT_TIMEOUT超时
XNET_RESULT_CANCELLED已取消
typedef enum xnetresult { XNET_RESULT_ERROR = -1, XNET_RESULT_OK = 0, XNET_RESULT_AGAIN, XNET_RESULT_CLOSED, XNET_RESULT_TRUNCATED, XNET_RESULT_TIMEOUT, XNET_RESULT_CANCELLED } xnetresult;

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_NAMEINTERFACE名称
XNET_ERROR_INTERFACE_INDEXINTERFACE索引
XNET_ERROR_INTERFACE_ADDRESS失败
XNET_ERROR_INTERFACE_HARDWARE失败
XNET_ERROR_HOST_NAMEHOST名称
XNET_ERROR_DNS_RESOLVE失败
XNET_ERROR_DNS_REVERSE失败
XNET_ERROR_DNS_RESULT失败
XNET_ERROR_RESOLVER_CREATERESOLVER创建
XNET_ERROR_RESOLVER_SUBMIT失败
XNET_ERROR_RESOLVER_CLOSEDRESOLVER已关闭
XNET_ERROR_RESOLVER_QUERY失败
XNET_ERROR_BUFFER_STATEBUFFER状态非法
XNET_ERROR_POOL_BUSY失败
XNET_ERROR_FRAME_CONFIGFRAME配置非法
XNET_ERROR_FRAME_STATEFRAME状态非法
XNET_ERROR_FRAME_LIMITFRAME超限
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_CONNECTSocket连接失败
XNET_ERROR_SOCKET_SHUTDOWN失败
XNET_ERROR_SOCKET_READSOCKET读方向
XNET_ERROR_SOCKET_WRITESOCKET写方向
XNET_ERROR_SOCKET_DGRAM_ERRORSOCKETDGRAM失败
XNET_ERROR_PORT_CREATEPORT创建
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_CREATEENGINE创建
XNET_ERROR_ENGINE_START失败
XNET_ERROR_ENGINE_STOP失败
XNET_ERROR_ENGINE_POSTEngine投递失败
XNET_ERROR_ENGINE_TIMER失败
XNET_ERROR_STREAM_CONFIGSTREAM配置非法
XNET_ERROR_STREAM_CREATESTREAM创建
XNET_ERROR_STREAM_CONNECT流连接失败
XNET_ERROR_STREAM_READSTREAM读方向
XNET_ERROR_STREAM_WRITESTREAM写方向
XNET_ERROR_STREAM_CLOSE失败
XNET_ERROR_DIAL_CONFIGDIAL配置非法
XNET_ERROR_DIAL_CREATEDIAL创建
XNET_ERROR_DIAL_RESOLVE失败
XNET_ERROR_DIAL_CONNECTDial连接失败
XNET_ERROR_LISTENER_CREATELISTENER创建
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_CONFIGUDP配置非法
XNET_ERROR_UDP_CREATEUDP创建
XNET_ERROR_UDP_RECEIVE接收方向
XNET_ERROR_UDP_RECEIVE_QUEUE接收方向
XNET_ERROR_UDP_SEND发送方向
XNET_ERROR_UDP_CLOSE失败
XNET_ERROR_PROXY_CONFIGPROXY配置非法
XNET_ERROR_PROXY_CREATEPROXY创建
XNET_ERROR_PROXY_PROTOCOLPROXY协议非法
XNET_ERROR_PROXY_AUTH失败
XNET_ERROR_PROXY_CONNECTProxy连接失败
XNET_ERROR_PROXY_LIMITPROXY超限
XNET_ERROR_PROXY_UNSUPPORTED代理协议不支持
typedef enum xneterror { XNET_ERROR_NONE = 0, 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, XNET_ERROR_INTERFACE_INDEX, XNET_ERROR_INTERFACE_ADDRESS, XNET_ERROR_INTERFACE_HARDWARE, XNET_ERROR_HOST_NAME, XNET_ERROR_DNS_RESOLVE, XNET_ERROR_DNS_REVERSE, XNET_ERROR_DNS_RESULT, XNET_ERROR_RESOLVER_CREATE, XNET_ERROR_RESOLVER_SUBMIT, XNET_ERROR_RESOLVER_CLOSED, XNET_ERROR_RESOLVER_QUERY, XNET_ERROR_BUFFER_STATE, XNET_ERROR_POOL_BUSY, XNET_ERROR_FRAME_CONFIG, XNET_ERROR_FRAME_STATE, XNET_ERROR_FRAME_LIMIT, 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, XNET_ERROR_SOCKET_SHUTDOWN, XNET_ERROR_SOCKET_READ, XNET_ERROR_SOCKET_WRITE, XNET_ERROR_SOCKET_DGRAM_ERROR, XNET_ERROR_PORT_CREATE, 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, XNET_ERROR_ENGINE_START, XNET_ERROR_ENGINE_STOP, XNET_ERROR_ENGINE_POST, XNET_ERROR_ENGINE_TIMER, XNET_ERROR_STREAM_CONFIG, XNET_ERROR_STREAM_CREATE, XNET_ERROR_STREAM_CONNECT, XNET_ERROR_STREAM_READ, XNET_ERROR_STREAM_WRITE, XNET_ERROR_STREAM_CLOSE, XNET_ERROR_DIAL_CONFIG, XNET_ERROR_DIAL_CREATE, XNET_ERROR_DIAL_RESOLVE, XNET_ERROR_DIAL_CONNECT, XNET_ERROR_LISTENER_CREATE, XNET_ERROR_LISTENER_ACCEPT, XNET_ERROR_LISTENER_CLOSE, XNET_ERROR_SERVER_CONFIG, XNET_ERROR_SERVER_START, XNET_ERROR_SERVER_ACCEPT, XNET_ERROR_UDP_CONFIG, XNET_ERROR_UDP_CREATE, XNET_ERROR_UDP_RECEIVE, XNET_ERROR_UDP_RECEIVE_QUEUE, XNET_ERROR_UDP_SEND, XNET_ERROR_UDP_CLOSE, XNET_ERROR_PROXY_CONFIG, XNET_ERROR_PROXY_CREATE, XNET_ERROR_PROXY_PROTOCOL, XNET_ERROR_PROXY_AUTH, XNET_ERROR_PROXY_CONNECT, XNET_ERROR_PROXY_LIMIT, XNET_ERROR_PROXY_UNSUPPORTED } xneterror;

xnetspan类型

只读 Span 借用调用方内存,不拥有数据。

字段类型语义
Datacbytes数据
Sizesize_t字节数
typedef struct xnetspan { cbytes Data; size_t Size; } xnetspan;

xnetwspan类型

可写 Span 借用调用方内存,不拥有数据。

字段类型语义
Databytes数据
Sizesize_t字节数
typedef struct xnetwspan { bytes Data; size_t Size; } xnetwspan;

xnetresolveopstate类型

解析操作只允许从等待态进入运行态,再进入一个不可变终态。

值语义
XNET_RESOLVE_PENDING等待中
XNET_RESOLVE_RUNNING运行中
XNET_RESOLVE_RESOLVED已解析
XNET_RESOLVE_FAILED已失败
XNET_RESOLVE_CANCELLED已取消
typedef enum xnetresolveopstate { XNET_RESOLVE_PENDING = 0, XNET_RESOLVE_RUNNING, XNET_RESOLVE_RESOLVED, XNET_RESOLVE_FAILED, XNET_RESOLVE_CANCELLED } xnetresolveopstate;

xnetresolverconfig类型

所有限额都是硬边界;TTL 使用单调秒,零值关闭对应缓存。

字段类型语义
Workersuint32工作线程数
RequestLimitsize_tRequestLimit
QueryLimitsize_tQueryLimit
CacheEntriessize_tCacheEntries
SuccessTTLuint64SuccessTTL
FailureTTLuint64FailureTTL
HostLimitsize_tHostLimit
ThreadStacksize_tThreadStack
LookupxnetresolverlookupLookup
LookupDataptrLookupData
typedef struct xnetresolverconfig { uint32 Workers; size_t RequestLimit; size_t QueryLimit; size_t CacheEntries; uint64 SuccessTTL; uint64 FailureTTL; size_t HostLimit; size_t ThreadStack; xnetresolverlookup Lookup; ptr LookupData; } xnetresolverconfig;

xnetresolverstats类型

统计值在 Resolver 锁内取得一致快照,不要求调用方停止提交。

字段类型语义
Workersuint32工作线程数
Submitteduint64Submitted
Rejecteduint64Rejected
CacheHitsuint64CacheHits
CacheMissesuint64CacheMisses
Coalesceduint64Coalesced
QueriesStarteduint64QueriesStarted
Resolveduint64Resolved
Faileduint64Failed
Cancelleduint64Cancelled
Outstandingsize_tOutstanding
ActiveQueriessize_tActiveQueries
QueuedQueriessize_tQueuedQueries
RunningQueriessize_tRunningQueries
ReadyCallbackssize_tReadyCallbacks
CachedResultssize_tCachedResults
typedef struct xnetresolverstats { uint32 Workers; uint64 Submitted; uint64 Rejected; uint64 CacheHits; uint64 CacheMisses; uint64 Coalesced; uint64 QueriesStarted; uint64 Resolved; uint64 Failed; uint64 Cancelled; size_t Outstanding; size_t ActiveQueries; size_t QueuedQueries; size_t RunningQueries; size_t ReadyCallbacks; size_t CachedResults; } xnetresolverstats;

xnetsockettype类型

Socket 类型使用稳定值,不直接暴露平台 SOCK_* 常量。

值语义
XNET_SOCKET_STREAM流式(TCP)
XNET_SOCKET_DGRAM数据报(UDP)
typedef enum xnetsockettype { XNET_SOCKET_STREAM = 1, XNET_SOCKET_DGRAM = 2 } xnetsockettype;

xnetdgrammetaflag类型

数据报元数据位既用于能力、启用配置,也用于标记每个报文的有效字段。

值语义
XNET_DGRAM_META_DESTINATION目的地址(辅助消息)
XNET_DGRAM_META_INTERFACE到达接口索引
XNET_DGRAM_META_HOP_LIMITHOP超限
XNET_DGRAM_META_TRAFFIC_CLASS流量类别
XNET_DGRAM_META_SEGMENT_SIZESEGMENT尺寸
XNET_DGRAM_META_TRUNCATED元数据被截断
typedef enum xnetdgrammetaflag { XNET_DGRAM_META_DESTINATION = 0x0001, XNET_DGRAM_META_INTERFACE = 0x0002, XNET_DGRAM_META_HOP_LIMIT = 0x0004, XNET_DGRAM_META_TRAFFIC_CLASS = 0x0008, /* 合并接收时表示每个原始数据报的分段大小,最后一段允许更短。 */ XNET_DGRAM_META_SEGMENT_SIZE = 0x0010, /* 控制缓冲被平台截断时保留已解析字段,并显式标记结果不完整。 */ XNET_DGRAM_META_TRUNCATED = 0x40000000 } xnetdgrammetaflag;

xnetdgrammeta类型

Destination 的端口恒为零;Flags 决定其余字段是否有效。

字段类型语义
Flagsuint32标志位
Destinationxnetaddr目的地址
Interfaceuint32Interface
HopLimitintHopLimit
TrafficClassintTrafficClass
SegmentSizeuint32SegmentSize
typedef struct xnetdgrammeta { uint32 Flags; xnetaddr Destination; uint32 Interface; int HopLimit; int TrafficClass; uint32 SegmentSize; } xnetdgrammeta;

xnetdgramcontrolflag类型

逐数据报发送控制位与接收元数据分离,避免 Source 和 Destination 语义混淆。

值语义
XNET_DGRAM_CONTROL_SOURCE源码位置
XNET_DGRAM_CONTROL_INTERFACE指定发送接口
XNET_DGRAM_CONTROL_HOP_LIMITHOP超限
XNET_DGRAM_CONTROL_TRAFFIC_CLASS指定流量类别
XNET_DGRAM_CONTROL_SEGMENT_SIZE指定 UDP 分段大小
typedef enum xnetdgramcontrolflag { XNET_DGRAM_CONTROL_SOURCE = 0x0001, XNET_DGRAM_CONTROL_INTERFACE = 0x0002, XNET_DGRAM_CONTROL_HOP_LIMIT = 0x0004, XNET_DGRAM_CONTROL_TRAFFIC_CLASS = 0x0008, /* 把一个聚合负载分段发送;最后一个数据报允许短于 SegmentSize。 */ XNET_DGRAM_CONTROL_SEGMENT_SIZE = 0x0010 } xnetdgramcontrolflag;

xnetdgramcontrol类型

Source 的端口必须为零;Flags 决定本次发送覆盖哪些 Socket 默认值。

字段类型语义
Flagsuint32标志位
Sourcexnetaddr源视图
Interfaceuint32Interface
HopLimitintHopLimit
TrafficClassintTrafficClass
SegmentSizeuint32SegmentSize
typedef struct xnetdgramcontrol { uint32 Flags; xnetaddr Source; uint32 Interface; int HopLimit; int TrafficClass; uint32 SegmentSize; } xnetdgramcontrol;

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接收方向
typedef enum xnetdgramcap { XNET_DGRAM_CAP_PATH_MTU_MODE = 0x0001, XNET_DGRAM_CAP_PATH_MTU_QUERY = 0x0002, XNET_DGRAM_CAP_ERROR_QUEUE = 0x0004, XNET_DGRAM_CAP_SEGMENT_SEND = 0x0008, XNET_DGRAM_CAP_SEGMENT_RECEIVE = 0x0010 } xnetdgramcap;

xnetpmtumode类型

SYSTEM 保留平台默认;DISCOVER 禁止 IP 分片;FRAGMENT 允许分片;PROBE 忽略路径缓存。

值语义
XNET_PMTU_SYSTEM沿用系统设置
XNET_PMTU_DISCOVER启用发现
XNET_PMTU_FRAGMENT禁用(允许分片)
XNET_PMTU_PROBE探测模式
typedef enum xnetpmtumode { XNET_PMTU_SYSTEM = 0, XNET_PMTU_DISCOVER, XNET_PMTU_FRAGMENT, XNET_PMTU_PROBE } xnetpmtumode;

xnetdgramerrororigin类型

错误来源独立于 ICMP Type/Code,LOCAL 也可以携带路径 MTU。

值语义
XNET_DGRAM_ERROR_UNKNOWN未知
XNET_DGRAM_ERROR_LOCAL失败
XNET_DGRAM_ERROR_ICMP失败
XNET_DGRAM_ERROR_ICMP6ICMPv6 错误
typedef enum xnetdgramerrororigin { XNET_DGRAM_ERROR_UNKNOWN = 0, XNET_DGRAM_ERROR_LOCAL, XNET_DGRAM_ERROR_ICMP, XNET_DGRAM_ERROR_ICMP6 } xnetdgramerrororigin;

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元数据被截断
typedef enum xnetdgramerrorflag { XNET_DGRAM_ERROR_REMOTE = 0x0001, XNET_DGRAM_ERROR_OFFENDER = 0x0002, XNET_DGRAM_ERROR_PATH_MTU = 0x0004, XNET_DGRAM_ERROR_PAYLOAD_TRUNCATED = 0x0008, XNET_DGRAM_ERROR_META_TRUNCATED = 0x0010 } xnetdgramerrorflag;

xnetdgramerror类型

异步网络错误是可读取数据,不会污染当前执行上下文的错误对象。

字段类型语义
Flagsuint32标志位
OriginxnetdgramerrororiginOrigin
Kindxerrkind错误种类
SystemCodeint平台错误码
Typeint类型
Codeint错误码
Infouint32信息输出
Datauint32数据
PathMtusize_tPathMtu
RemotexnetaddrRemote
OffenderxnetaddrOffender
typedef struct xnetdgramerror { uint32 Flags; xnetdgramerrororigin Origin; xerrkind Kind; int SystemCode; int Type; int Code; uint32 Info; uint32 Data; size_t PathMtu; xnetaddr Remote; xnetaddr Offender; } xnetdgramerror;

xnetdgramrecv类型

批量接收项由调用方提供缓冲,函数写入来源、可见长度和单报文结果。

字段类型语义
Datavoid*数据
Capacitysize_t容量
RemotexnetaddrRemote
Metaxnetdgrammeta元数据
Sizesize_t字节数
Resultxnetresult结果输出
typedef struct xnetdgramrecv { void* Data; size_t Capacity; xnetaddr Remote; xnetdgrammeta Meta; size_t Size; xnetresult Result; } xnetdgramrecv;

xnetdgramsend类型

批量发送项在调用期间借用数据;空远端表示使用连接式 UDP 的固定 Peer。

字段类型语义
Remoteconst xnetaddr*Remote
Dataconst void*数据
Sizesize_t字节数
typedef struct xnetdgramsend { const xnetaddr* Remote; const void* Data; size_t Size; } xnetdgramsend;

xnetsocketflag类型

Socket 打开标志可以组合;系统句柄始终禁止被子进程继承。

值语义
XNET_SOCKET_NONBLOCK非阻塞模式
typedef enum xnetsocketflag { XNET_SOCKET_NONBLOCK = 0x01 } xnetsocketflag;

xnetshutdown类型

半关闭方向与平台 SHUT_* 常量保持隔离。

值语义
XNET_SHUTDOWN_READ读方向
XNET_SHUTDOWN_WRITE写方向
XNET_SHUTDOWN_BOTH双向关断
typedef enum xnetshutdown { XNET_SHUTDOWN_READ = 1, XNET_SHUTDOWN_WRITE, XNET_SHUTDOWN_BOTH } xnetshutdown;

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_ALIVETCP 保活
XNET_OPTION_BROADCAST广播
XNET_OPTION_IPV6_ONLY仅 IPv6
XNET_OPTION_RECEIVE_BUFFER接收方向
XNET_OPTION_SEND_BUFFER发送方向
XNET_OPTION_LINGER迟滞关闭
XNET_OPTION_HOP_LIMITHOP超限
XNET_OPTION_TRAFFIC_CLASS流量类别
XNET_OPTION_PATH_MTU_MODE路径 MTU 模式
XNET_OPTION_PATH_MTU路径 MTU 探测上限
XNET_OPTION_DGRAM_ERRORSICMP 错误投递
XNET_OPTION_ERROR失败
typedef enum xnetoption { XNET_OPTION_NONBLOCK = 1, XNET_OPTION_REUSE_ADDRESS, XNET_OPTION_REUSE_PORT, XNET_OPTION_EXCLUSIVE_ADDRESS, XNET_OPTION_NO_DELAY, XNET_OPTION_KEEP_ALIVE, XNET_OPTION_BROADCAST, XNET_OPTION_IPV6_ONLY, XNET_OPTION_RECEIVE_BUFFER, XNET_OPTION_SEND_BUFFER, XNET_OPTION_LINGER, XNET_OPTION_HOP_LIMIT, XNET_OPTION_TRAFFIC_CLASS, XNET_OPTION_PATH_MTU_MODE, XNET_OPTION_PATH_MTU, XNET_OPTION_DGRAM_ERRORS, XNET_OPTION_ERROR } xnetoption;

xnetportbackend类型

AUTO 选择当前平台最优后端,显式值用于测试、降级和部署控制。

值语义
XNET_PORT_AUTO自动
XNET_PORT_IOCPWindows IOCP
XNET_PORT_URINGLinux io_uring
XNET_PORT_EPOLLLinux epoll
XNET_PORT_KQUEUEBSD kqueue
XNET_PORT_SELECTselect 就绪
typedef enum xnetportbackend { XNET_PORT_AUTO = 0, XNET_PORT_IOCP, XNET_PORT_URING, XNET_PORT_EPOLL, XNET_PORT_KQUEUE, XNET_PORT_SELECT } xnetportbackend;

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_POSTPOST 方法
XNET_PORT_CAP_CANCEL在途取消
XNET_PORT_CAP_READ_PROBE读方向PROBE
XNET_PORT_CAP_DGRAM_ERRORDGRAM失败
XNET_PORT_CAP_SEND_FILE发送方向
XNET_PORT_CAP_FILE_IO原生文件 I/O
typedef enum xnetportcap { XNET_PORT_CAP_READINESS = 0x0001, XNET_PORT_CAP_COMPLETION = 0x0002, XNET_PORT_CAP_ONESHOT = 0x0004, XNET_PORT_CAP_EDGE = 0x0008, XNET_PORT_CAP_BATCH = 0x0010, XNET_PORT_CAP_WAKE = 0x0020, XNET_PORT_CAP_POST = 0x0040, XNET_PORT_CAP_CANCEL = 0x0080, XNET_PORT_CAP_READ_PROBE = 0x0100, XNET_PORT_CAP_DGRAM_ERROR = 0x0200, XNET_PORT_CAP_SEND_FILE = 0x0400, XNET_PORT_CAP_FILE_IO = 0x0800 } xnetportcap;

xnetpoll类型

readiness 关注位;错误与挂断始终隐式观察。

值语义
XNET_POLL_READXNETPOLL读方向
XNET_POLL_WRITE可写
typedef enum xnetpoll { XNET_POLL_READ = 0x01, XNET_POLL_WRITE = 0x02 } xnetpoll;

xnetporteventtype类型

一个事件只属于一个稳定类别,具体 readiness 状态由 Flags 组合表达。

值语义
XNET_PORT_EVENT_READY就绪
XNET_PORT_EVENT_ACCEPT可接受连接
XNET_PORT_EVENT_CONNECTCONNECT 方法
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_ERRORRECV失败
XNET_PORT_EVENT_SEND_TO发送方向
XNET_PORT_EVENT_SEND_MSG发送方向
XNET_PORT_EVENT_SEND_FILE发送方向
XNET_PORT_EVENT_FILE_READFILE读方向
XNET_PORT_EVENT_FILE_WRITEFILE写方向
XNET_PORT_EVENT_USER用户唤醒
XNET_PORT_EVENT_WAKE用户唤醒
typedef enum xnetporteventtype { XNET_PORT_EVENT_READY = 1, XNET_PORT_EVENT_ACCEPT, XNET_PORT_EVENT_CONNECT, XNET_PORT_EVENT_READ_PROBE, XNET_PORT_EVENT_RECV, XNET_PORT_EVENT_SEND, XNET_PORT_EVENT_RECV_FROM, XNET_PORT_EVENT_RECV_MSG, XNET_PORT_EVENT_RECV_ERROR, XNET_PORT_EVENT_SEND_TO, XNET_PORT_EVENT_SEND_MSG, XNET_PORT_EVENT_SEND_FILE, XNET_PORT_EVENT_FILE_READ, XNET_PORT_EVENT_FILE_WRITE, XNET_PORT_EVENT_USER, XNET_PORT_EVENT_WAKE } xnetporteventtype;

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需要更多输入
typedef enum xnetporteventflag { XNET_PORT_EVENT_READ = 0x0001, XNET_PORT_EVENT_WRITE = 0x0002, XNET_PORT_EVENT_ERROR = 0x0004, XNET_PORT_EVENT_HANGUP = 0x0008, XNET_PORT_EVENT_EOF = 0x0010, XNET_PORT_EVENT_MORE = 0x0020 } xnetporteventflag;

xnetportconfig类型

配置不带版本字段;OperationCache 是每个完成操作尺寸类的缓存上限,零值关闭缓存。

字段类型语义
BackendxnetportbackendBackend
Flagsuint32标志位
PostLimitsize_tPostLimit
WatchLimitsize_tWatchLimit
OperationLimitsize_tOperationLimit
OperationCachesize_tOperationCache
typedef struct xnetportconfig { xnetportbackend Backend; uint32 Flags; size_t PostLimit; /* Watch/Operation 为零时按实际后端选择可扩展默认值。 */ size_t WatchLimit; size_t OperationLimit; size_t OperationCache; } xnetportconfig;

xnetportevent类型

端口事件借用原 Socket;只有 Accepted 在接受完成时转移新对象所有权。

字段类型语义
Typexnetporteventtype类型
Flagsuint32标志位
Resultxnetresult结果输出
SystemCodeint平台错误码
Bytessize_tBytes
Iduint64标识
SocketxnetsocketSocket
AcceptedxnetsocketAccepted
Addressxnetaddr地址
Metaxnetdgrammeta元数据
DgramErrorxnetdgramerrorDgramError
UserptrUser
typedef struct xnetportevent { xnetporteventtype Type; uint32 Flags; xnetresult Result; int SystemCode; size_t Bytes; uint64 Id; xnetsocket Socket; xnetsocket Accepted; xnetaddr Address; xnetdgrammeta Meta; xnetdgramerror DgramError; ptr User; } xnetportevent;

xnetenginestate类型

Engine 生命周期状态可安全地跨线程查询。

值语义
XNET_ENGINE_STOPPED已停止
XNET_ENGINE_STARTING启动中
XNET_ENGINE_RUNNING运行中
XNET_ENGINE_STOPPING停止中
XNET_ENGINE_DESTROYING销毁中
typedef enum xnetenginestate { XNET_ENGINE_STOPPED = 0, XNET_ENGINE_STARTING, XNET_ENGINE_RUNNING, XNET_ENGINE_STOPPING, XNET_ENGINE_DESTROYING } xnetenginestate;

xnetpost类型

Post 的队列节点与并发门保持不透明,允许嵌入网络对象。

字段类型语义
Alignmentuint64对齐(二次幂)
typedef union xnetpost { uint64 Alignment; uint8 Storage[XNET_POST_STORAGE_SIZE]; } xnetpost;

xnetcompletion类型

Completion 借用过程与数据,必须存活到对应端口事件回调结束。

字段类型语义
Procxnetcompletionproc过程指针
Dataptr数据
typedef struct xnetcompletion { xnetcompletionproc Proc; ptr Data; } xnetcompletion;

xnetengineconfig类型

容量字段都是硬边界;CommandCapacity 会向上取整为 2 次幂。

字段类型语义
BackendxnetportbackendBackend
Workersuint32工作线程数
BufferPoolconst xnetbufpoolconfig*BufferPool
CommandCapacitysize_tCommandCapacity
NodeCacheBytessize_tNodeCacheBytes
TimerLimitsize_tTimerLimit
EventBatchsize_tEventBatch
PortPostLimitsize_tPortPostLimit
PortWatchLimitsize_tPortWatchLimit
PortOperationLimitsize_tPortOperationLimit
PortOperationCachesize_tPortOperationCache
IdleWaituint64IdleWait
ThreadStacksize_tThreadStack
typedef struct xnetengineconfig { xnetportbackend Backend; uint32 Workers; const xnetbufpoolconfig* BufferPool; size_t CommandCapacity; size_t NodeCacheBytes; size_t TimerLimit; size_t EventBatch; size_t PortPostLimit; /* 两个端口容量为零时由每个 Worker 的实际后端解析。 */ size_t PortWatchLimit; size_t PortOperationLimit; size_t PortOperationCache; uint64 IdleWait; size_t ThreadStack; } xnetengineconfig;

xnetworkerstats类型

Worker 统计是并发快照,计数在 Engine 重启后继续累计。

字段类型语义
PostsAccepteduint64PostsAccepted
PostsRejecteduint64PostsRejected
PostsExecuteduint64PostsExecuted
TimersAccepteduint64TimersAccepted
TimersRejecteduint64TimersRejected
TimersFireduint64TimersFired
TimersCancelleduint64TimersCancelled
TimersCloseduint64TimersClosed
TimerErrorsuint64TimerErrors
Eventsuint64事件表
WaitErrorsuint64WaitErrors
WakeErrorsuint64WakeErrors
ShutdownStallsuint64ShutdownStalls
LastWaitErrorxneterrorLastWaitError
LastWaitSystemCodeintLastWaitSystemCode
NodeCacheHitsuint64NodeCacheHits
NodeCacheMissesuint64NodeCacheMisses
PendingCommandssize_tPendingCommands
ActiveTimerssize_tActiveTimers
NodeCachedBytessize_tNodeCachedBytes
typedef struct xnetworkerstats { uint64 PostsAccepted; uint64 PostsRejected; uint64 PostsExecuted; uint64 TimersAccepted; uint64 TimersRejected; uint64 TimersFired; uint64 TimersCancelled; uint64 TimersClosed; uint64 TimerErrors; uint64 Events; uint64 WaitErrors; uint64 WakeErrors; /* BASIC 以上统计中,停机任务链未在安全代数内收敛的累计次数。 */ uint64 ShutdownStalls; /* 最近一次端口等待错误;没有错误时 Code 为 XNET_ERROR_NONE。 */ xneterror LastWaitError; int LastWaitSystemCode; uint64 NodeCacheHits; uint64 NodeCacheMisses; size_t PendingCommands; size_t ActiveTimers; size_t NodeCachedBytes; } xnetworkerstats;

xnetenginestats类型

Engine 统计聚合全部 Worker,并附带当前生命周期状态。

字段类型语义
Statexnetenginestate状态
Workersuint32工作线程数
PostsAccepteduint64PostsAccepted
PostsRejecteduint64PostsRejected
PostsExecuteduint64PostsExecuted
TimersAccepteduint64TimersAccepted
TimersRejecteduint64TimersRejected
TimersFireduint64TimersFired
TimersCancelleduint64TimersCancelled
TimersCloseduint64TimersClosed
TimerErrorsuint64TimerErrors
Eventsuint64事件表
WaitErrorsuint64WaitErrors
WakeErrorsuint64WakeErrors
ShutdownStallsuint64ShutdownStalls
NodeCacheHitsuint64NodeCacheHits
NodeCacheMissesuint64NodeCacheMisses
PendingCommandssize_tPendingCommands
ActiveTimerssize_tActiveTimers
NodeCachedBytessize_tNodeCachedBytes
LiveObjectssize_tLiveObjects
typedef struct xnetenginestats { xnetenginestate State; uint32 Workers; uint64 PostsAccepted; uint64 PostsRejected; uint64 PostsExecuted; uint64 TimersAccepted; uint64 TimersRejected; uint64 TimersFired; uint64 TimersCancelled; uint64 TimersClosed; uint64 TimerErrors; uint64 Events; uint64 WaitErrors; uint64 WakeErrors; /* BASIC 以上统计中,全部 Worker 停机任务链未收敛次数之和。 */ uint64 ShutdownStalls; uint64 NodeCacheHits; uint64 NodeCacheMisses; size_t PendingCommands; size_t ActiveTimers; size_t NodeCachedBytes; size_t LiveObjects; } xnetenginestats;

xnetref类型

引用 Span 在受理后转移释放责任,零长度 Span 不转移所有权。

字段类型语义
Datacbytes数据
Sizesize_t字节数
ReleasexnetreleaseprocRelease
Contextptr回调上下文
typedef struct xnetref { cbytes Data; size_t Size; xnetreleaseproc Release; ptr Context; } xnetref;

xnetbufpoolinfo类型

缓冲池统计区分实时、缓存、分配、复用和动态大块。

字段类型语义
LiveBlockssize_tLiveBlocks
LiveBytessize_tLiveBytes
PeakBlockssize_tPeakBlocks
PeakBytessize_tPeakBytes
CachedBlockssize_tCachedBlocks
CachedBytessize_tCachedBytes
AllocCountuint64AllocCount
ReuseCountuint64ReuseCount
DynamicCountuint64DynamicCount
RefCountuint64RefCount
typedef struct xnetbufpoolinfo { size_t LiveBlocks; size_t LiveBytes; size_t PeakBlocks; size_t PeakBytes; size_t CachedBlocks; size_t CachedBytes; uint64 AllocCount; uint64 ReuseCount; uint64 DynamicCount; uint64 RefCount; } xnetbufpoolinfo;

xnetbuf类型

缓冲链可栈上使用;字段用于零分配查询,调用方不得直接修改。

字段类型语义
Headxnetblock*头指针
Tailxnetblock*尾指针
Reservedxnetblock*保留(必须为零)
Poolxnetbufpool*Pool
Sizesize_t字节数
Blockssize_tBlocks
ReservedNewboolReservedNew
typedef struct xnetbuf { xnetblock* Head; xnetblock* Tail; xnetblock* Reserved; xnetbufpool* Pool; size_t Size; size_t Blocks; bool ReservedNew; } xnetbuf;

xnetaddrlist类型

地址列表是不可变共享结果,解析器缓存和调用方可以独立持有引用。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetaddrlist xnetaddrlist;

xnetresolver类型

Resolver 与解析操作均保持不透明,解析操作可以独立于调用方引用继续执行。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetresolver xnetresolver;

xnetresolveop类型

解析操作对象(不透明):线程安全的可等待句柄,内含查询状态与结果地址列表。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetresolveop xnetresolveop;

xnetport类型

网络端口隐藏平台事件对象、注册表和跨线程唤醒资源。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetport_impl xnetport;

xnetbufpoolconfig类型

网络缓冲池配置:按尺寸类预分配缓冲,供 xrtNetBufPool 创建共享池。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetbufpoolconfig xnetbufpoolconfig;

xnetbufpool类型

网络缓冲池(不透明):进程内共享的按类缓冲池,降低热路径分配。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetbufpool xnetbufpool;

xnetbytes类型

拥有型字节结果(不透明):一次性消费的动态缓冲,用后销毁。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetbytes xnetbytes;

xnetengine类型

Engine 与 Worker 对外保持不透明,所有 Worker 资源都归所属 Engine 管理。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetengine xnetengine;

xnetworker类型

网络 Worker(不透明):Engine 的执行单元,流与监听器绑定其上。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetworker xnetworker;

xnetblock类型

网络分块借用(opaque 由 net.md 正文描述):面向 Completion 的零拷贝视图单元。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xnetblock xnetblock;

xnetresolverlookup类型

自定义查询过程必须返回端口为零的不可变地址列表,并在失败时设置结构化错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xnetaddrlist* (*xnetresolverlookup)( cstr sHost, xnetfamily Family, ptr pData );

xnetresolveproc类型

完成回调借用操作对象;保留到回调之后时必须显式增加引用。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xnetresolveproc)(xnetresolveop* pOperation, ptr pData)

xnettaskproc类型

Engine 任务始终在选定 Worker 上串行执行。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xnettaskproc)(xnetworker* pWorker, ptr pData)

xnettimerproc类型

Timer 受理后恰好终结一次,结果区分到期、取消、停止和内部失败。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xnettimerproc)(xnetworker* pWorker, uint64 Id, xnetresult Result, ptr pData)

xnetcompletionproc类型

Engine 内的端口事件通过 Completion 回到所属 Worker。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xnetcompletionproc)(xnetworker* pWorker, const xnetportevent* pEvent, ptr pData)

xnetreleaseproc类型

外部引用的释放过程在最后一段数据离开缓冲时执行一次。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xnetreleaseproc)(ptr pContext, cbytes pData, size_t iSize)
构造与解析

xrtNetAddrAny函数

构造指定族的未指定地址(IPv4 0.0.0.0 或 IPv6 ::)。

bool xrtNetAddrAny(xnetaddr* pAddr, xnetfamily Family, uint16 iPort)

参数

参数方向约束说明
pAddr输出非空接收构造结果
Family输入IPV4 或 IPV6其他值失败
iPort输入—填入端口;0 合法(服务器动态端口绑定)
返回值
返回含义失败时状态
true已构造—
false族不合法输出不被修改;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — pAddr == NULL 或 Family 非法

范例已编译验证

addr_tour · 通配地址构造与判定

if ( !xrtNetAddrAny(&Any, XNET_FAMILY_IPV4, 0u) ||

xrtNetAddrLoopback函数

构造指定族的回环地址(IPv4 127.0.0.1 或 IPv6 ::1)。

bool xrtNetAddrLoopback(xnetaddr* pAddr, xnetfamily Family, uint16 iPort)

参数

参数方向约束说明
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。

bool xrtNetAddrParse(xnetaddr* pAddr, cstr sIP, uint16 iPort)

参数

参数方向约束说明
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 或使用默认端口的裸地址。

bool xrtNetAddrParseEndpoint(xnetaddr* pAddr, cstr sEndpoint, uint16 iDefaultPort)

参数

参数方向约束说明
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 文本,返回不含结尾零字节的所需长度。

size_t xrtNetAddrText(const xnetaddr* pAddr, char* sText, size_t iCapacity)

参数

参数方向约束说明
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 始终使用方括号。

size_t xrtNetAddrEndpointText(const xnetaddr* pAddr, char* sText, size_t iCapacity)

参数

参数方向约束说明
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 文本。

str xrtNetAddrString(const xnetaddr* pAddr)

参数

参数方向约束说明
pAddr输入非空—
返回值
返回含义失败时状态
非空拥有式零结尾文本,xrtFree 释放;可长期保存、跨函数传递、同表达式多次调用(替换旧版线程局部环形缓冲)—
NULL地址非法或分配失败错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 参数非法
  • 分配失败 — 文本内存申请失败

范例已编译验证

network/dns · 基础范例 · 同族拥有式端点文本用法

str sEndpoint = xrtNetAddrEndpointString(

xrtNetAddrEndpointString函数

分配并返回带端口的规范端点文本。

str xrtNetAddrEndpointString(const xnetaddr* pAddr)

参数

参数方向约束说明
pAddr输入非空IPv6 自动加方括号
返回值
返回含义失败时状态
非空拥有式零结尾文本,xrtFree 释放—
NULL地址非法或分配失败错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 参数非法
  • 分配失败 — 文本内存申请失败

范例已编译验证

network/address · 基础范例 · 端点往返

sEndpoint = xrtNetAddrEndpointString(&Addr);
if ( sEndpoint == NULL ) {
	return 1;
}
比较与分类

xrtNetAddrEqual函数

比较完整端点:族、地址、IPv6 Scope 与端口全等。

bool xrtNetAddrEqual(const xnetaddr* pLeft, const xnetaddr* pRight)

参数

参数方向约束说明
pLeft输入非空—
pRight输入非空—
返回值
返回含义
true完整端点相同(端口不同即不等)
false任一分量不同
错误
  • 无——纯谓词不设置错误

范例已编译验证

addr_tour · SameIP 分界:同 IP 换端口

if ( xrtNetAddrEqual(&Loopback, &Private) ||
	!xrtNetAddrEqual(&Private, &Private) ||
	xrtNetAddrEqual(&Private, &Other) ||

xrtNetAddrSameIP函数

只比较地址族、地址与 IPv6 Scope,不比较端口。

bool xrtNetAddrSameIP(const xnetaddr* pLeft, const xnetaddr* pRight)

参数

参数方向约束说明
pLeft输入非空—
pRight输入非空—
返回值
返回含义
true同族同地址同 Scope(端口可不同)
false地址分量不同
错误
  • 无——纯谓词不设置错误

范例已编译验证

addr_tour · 与 Equal 对照

xrtNetAddrSameIP(&Loopback, &Private) ||
	!xrtNetAddrSameIP(&Private, &Other) ) {

xrtNetAddrCompare函数

为 Map、排序和稳定去重提供完整端点全序。

int xrtNetAddrCompare(const xnetaddr* pLeft, const xnetaddr* pRight)

参数

参数方向约束说明
pLeft输入非空—
pRight输入非空—
返回值
返回含义
负数左端点按序在前(比较序:族 → 地址 → Scope → 端口)
0完整端点相同
正数左端点在后

范例已编译验证

addr_tour · 自反为零、10 < 127

if ( (xrtNetAddrCompare(&Private, &Private) != 0) ||
	(xrtNetAddrCompare(&Private, &Loopback) >= 0) ||

xrtNetAddrIsUnspecified函数

判断地址是否为 IPv4 0.0.0.0 或 IPv6 ::。

bool xrtNetAddrIsUnspecified(const xnetaddr* pAddr)

参数

参数方向约束说明
pAddr输入非空只看地址,端口无关
返回值
返回含义
true未指定地址
false其他地址
错误
  • 无——纯谓词不设置错误

范例已编译验证

addr_tour · Any 构造后判定

xrtNetAddrIsUnspecified(&Loopback) ||
	!xrtNetAddrIsUnspecified(&Any) ||

xrtNetAddrIsLoopback函数

判断地址是否属于 IPv4 127/8 或 IPv6 ::1。

bool xrtNetAddrIsLoopback(const xnetaddr* pAddr)

参数

参数方向约束说明
pAddr输入非空IPv4 整个 127/8 段都算回环
返回值
返回含义
true回环地址
false其他地址
错误
  • 无——纯谓词不设置错误

范例已编译验证

addr_tour · 正反判定

!xrtNetAddrIsLoopback(&Loopback) ||
	xrtNetAddrIsLoopback(&Private) ||

xrtNetAddrIsMulticast函数

判断地址是否属于 IPv4 224/4 或 IPv6 ff00::/8。

bool xrtNetAddrIsMulticast(const xnetaddr* pAddr)

参数

参数方向约束说明
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。

bool xrtNetAddrIsLinkLocal(const xnetaddr* pAddr)

参数

参数方向约束说明
pAddr输入非空—
返回值
返回含义
true链路本地地址
false其他地址
错误
  • 无——纯谓词不设置错误

范例已编译验证

network/address · 基础范例 · Scope 端点解析后判定

xrtNetAddrIsLinkLocal(&Addr) ? "yes" : "no");

xrtNetAddrIsPrivate函数

判断地址是否属于 RFC 1918 IPv4 或 RFC 4193 IPv6 私有范围。

bool xrtNetAddrIsPrivate(const xnetaddr* pAddr)

参数

参数方向约束说明
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 映射地址。

bool xrtNetAddrIsMapped(const xnetaddr* pAddr)

参数

参数方向约束说明
pAddr输入非空IPv4 地址恒为假
返回值
返回含义
trueIPv4 映射 IPv6
false普通地址
错误
  • 无——纯谓词不设置错误

范例已编译验证

addr_tour · ::ffff:192.168.0.1 命中

if ( !xrtNetAddrParse(&Mapped, "::ffff:192.168.0.1", 443u) ||
	!xrtNetAddrIsMapped(&Mapped) ||

xrtNetAddrUnmap函数

把 IPv4 映射 IPv6 地址转换为 IPv4;其他地址原样复制(保留端口)。

bool xrtNetAddrUnmap(const xnetaddr* pAddr, xnetaddr* pResult)

参数

参数方向约束说明
pAddr输入非空—
pResult输出非空非映射地址原样复制,允许统一规范化不加分支
返回值
返回含义失败时状态
true已写出(转换或原样)—
false参数非法输出不被修改;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针

范例已编译验证

addr_tour · 映射还原 + 非映射原样

!xrtNetAddrUnmap(&Mapped, &Unmapped) ||
	!xrtNetAddrParse(&Other, "192.168.0.1", 443u) ||
	!xrtNetAddrEqual(&Unmapped, &Other) ||
Native 逃生口

xrtNetAddrToNative函数

转换为平台 sockaddr;空输出可查询所需大小。

bool xrtNetAddrToNative(const xnetaddr* pAddr, void* pNative, size_t* pSize)

参数

参数方向约束说明
pAddr输入非空—
pNative输出允许空指针NULL 时只经 *pSize 返回所需 sockaddr_in/sockaddr_in6 大小
pSize输入输出非空入参为容量、出参为实际大小;容量不足也会更新大小
返回值
返回含义失败时状态
true已写出(或已报告大小)—
false参数非法或容量不足错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • XNET_ERROR_BUFFER — 缓冲不足(*pSize 已更新为所需大小)

范例已编译验证

addr_tour · 先查询后写出的两段式

if ( !xrtNetAddrToNative(&Loopback, NULL, &iSize) ||

xrtNetAddrFromNative函数

从平台 sockaddr 转换为稳定地址结构。

bool xrtNetAddrFromNative(xnetaddr* pAddr, const void* pNative, size_t iSize)

参数

参数方向约束说明
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函数

初始化默认尺寸类与有界缓存策略的池配置。

void xrtNetBufPoolConfigInit(xnetbufpoolconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空填入 512/2048/8192/32768 尺寸类与 2 MiB 总缓存上限
返回值
返回含义
无纯初始化;pConfig == NULL 是参数错误(经 xrtGetError() 可查)

范例已编译验证

buf_tour · 池生命周期起点

xrtNetBufPoolConfigInit(&Config);
pPool = xrtNetBufPoolCreate(&Config);

xrtNetBufPoolCreate函数

创建一个缓冲池;空配置使用默认值。

xnetbufpool* xrtNetBufPoolCreate(const xnetbufpoolconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空指针NULL 使用默认配置;配置内容在创建期间复制
返回值
返回含义失败时状态
非空新池,配对 xrtNetBufPoolDestroy() 释放—
NULL分配失败错误经 xrtGetError() 报告
错误
  • 分配失败 — 池结构内存申请失败

范例已编译验证

buf_tour · 默认配置建池并挂两个缓冲

if ( (pPool == NULL) ||
	!xrtNetBufInit(&BufA, pPool) ||
	!xrtNetBufInit(&BufB, pPool) ) {

xrtNetBufPoolDestroy函数

销毁已无实时块的池;仍有外借块时失败并保留池。

bool xrtNetBufPoolDestroy(xnetbufpool* pPool)

参数

参数方向约束说明
pPool输入允许空指针空指针是成功空操作;块即使被 Move 到别的缓冲也仍计入原池实时统计
返回值
返回含义失败时状态
true池已释放(先 Trim 清空缓存)—
false仍有实时块池保持完整、块中无悬空指针;错误经 xrtGetError() 报告
错误
  • XERR_STATE + XNET_ERROR_POOL_BUSY — LiveBlocks != 0

范例已编译验证

buf_tour · 失败路径的销毁收尾

if ( pPool != NULL ) {
	xrtNetBufPoolDestroy(pPool);
}

xrtNetBufPoolTrim函数

把缓存裁剪到不超过指定字节数,返回真正释放的块数。

size_t xrtNetBufPoolTrim(xnetbufpool* pPool, size_t iRetainBytes)

参数

参数方向约束说明
pPool输入非空只释放缓存块,不影响实时数据
iRetainBytes输入—保留的缓存预算;0 清空全部缓存
返回值
返回含义失败时状态
释放块数可能大于等于 0参数非法时返回 0 并设置错误
错误
  • XERR_ARGUMENT — pPool == NULL

范例已编译验证

buf_tour · 清空全部缓存

iGot = xrtNetBufPoolTrim(pPool, 0u);
if ( iGot < 1u ) {

xrtNetBufPoolGet函数

复制缓冲池当前统计,不分配内存。

void xrtNetBufPoolGet(const xnetbufpool* pPool, xnetbufpoolinfo* pInfo)

参数

参数方向约束说明
pPool输入非空—
pInfo输出非空实时/峰值块数与容量、缓存块数与容量、分配/复用/动态大块/外部引用计数;LiveBytes 对拥有块统计容量、对引用块统计逻辑长度
返回值
返回含义
无参数非法时不修改输出(经 xrtGetError() 可查)

范例已编译验证

buf_tour · 空池统计全零

xrtNetBufPoolGet(pPool, &Info);
if ( (Info.LiveBlocks != 0u) ||
	(Info.AllocCount != 0u) ) {

xrtNetBufInit函数

初始化空缓冲链;池为空时使用全局分配器且不缓存。

bool xrtNetBufInit(xnetbuf* pBuffer, xnetbufpool* pPool)

参数

参数方向约束说明
pBuffer输出非空可栈上或嵌入连接对象;结构可继续 Clear 复用
pPool输入允许空指针空池适合跨线程所有权和低频独立使用
返回值
返回含义失败时状态
true已初始化为空链—
false参数非法结构不被触碰;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — pBuffer == NULL

范例已编译验证

buf_tour · 挂到所属池

!xrtNetBufInit(&BufA, pPool) ||

xrtNetBufClear函数

释放全部块并放弃尚未提交的写入预留。

void xrtNetBufClear(xnetbuf* pBuffer)

参数

参数方向约束说明
pBuffer输入输出允许空指针幂等;引用块的释放过程在此时执行
返回值
返回含义
无空指针是空操作

范例已编译验证

buf_tour · Clear 触发 AppendRef 释放回调

xrtNetBufClear(&BufA);
xrtNetBufClear(&BufB);
if ( iReleased != 1 ) {

xrtNetBufSize函数

返回缓冲链总字节数。

size_t xrtNetBufSize(const xnetbuf* pBuffer)

参数

参数方向约束说明
pBuffer输入非空—
返回值
返回含义
字节数跨全部块的活动数据总量

范例已编译验证

buf_tour · 四类追加后恰 11 字节

iSize = xrtNetBufSize(&BufA);

xrtNetBufEmpty函数

返回缓冲链是否为空。

bool xrtNetBufEmpty(const xnetbuf* pBuffer)

参数

参数方向约束说明
pBuffer输入非空—
返回值
返回含义
true无活动数据
false至少一个字节
错误
  • 无——纯谓词不设置错误

范例已编译验证

buf_tour · Move 后源为空

!xrtNetBufMove(&BufA, &BufB) ||
	!xrtNetBufEmpty(&BufB) ||

xrtNetBufSpanCount函数

返回当前缓冲链的只读 Span 总数。

size_t xrtNetBufSpanCount(const xnetbuf* pBuffer)

参数

参数方向约束说明
pBuffer输入非空—
返回值
返回含义
Span 数完整消费所需的数组容量

范例已编译验证

buf_tour · 四类追加后至少 4 段

iSpans = xrtNetBufSpanCount(&BufA);

xrtNetBufSpans函数

借用最多指定数量的只读 Span。

size_t xrtNetBufSpans(const xnetbuf* pBuffer, xnetspan* pSpans, size_t iCapacity)

参数

参数方向约束说明
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;空缓冲返回假。

bool xrtNetBufFront(const xnetbuf* pBuffer, xnetspan* pSpan)

参数

参数方向约束说明
pBuffer输入非空—
pSpan输出非空空缓冲时被清为 { NULL, 0 }
返回值
返回含义失败时状态
true首段非空—
false缓冲为空或参数非法空缓冲属正常路径不设错;参数非法设置错误
错误
  • XERR_ARGUMENT — 空指针

范例已编译验证

network/buffer · 基础范例 · Reserve→Commit 后取首段

if ( !xrtNetBufCommit(&Buffer, 6) ||
	!xrtNetBufFront(&Buffer, &Read) ) {

xrtNetBufAppend函数

复制一段数据到链尾;整个追加失败原子。

bool xrtNetBufAppend(xnetbuf* pBuffer, const void* pData, size_t iSize)

参数

参数方向约束说明
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函数

追加借用数据;调用方保证数据存活到该段被消费或清除。

bool xrtNetBufAppendBorrow(xnetbuf* pBuffer, const void* pData, size_t iSize)

参数

参数方向约束说明
pBuffer输入输出非空—
pData输入iSize > 0 时非空借用——不复制,存活期由调用方保证
iSize输入—字节数
返回值
返回含义失败时状态
true已借用追加(零复制)—
false参数非法或登记失败原数据不变;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • 溢出 — 总长溢出

范例已编译验证

buf_tour · 与 Append 连用

!xrtNetBufAppendBorrow(&BufA, arrBorrow, 2u) ) {

xrtNetBufAppendTake函数

接管由 xrtMalloc 家族分配的数据;成功后由缓冲最终 xrtFree。

bool xrtNetBufAppendTake(xnetbuf* pBuffer, ptr pData, size_t iSize)

参数

参数方向约束说明
pBuffer输入输出非空—
pData输入iSize > 0 时非空接管——必须来自 xrtMalloc 家族;失败时所有权仍归调用方
iSize输入—字节数
返回值
返回含义失败时状态
true已接管追加—
false参数非法或登记失败数据仍归调用方释放;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • 溢出 — 总长溢出

范例已编译验证

buf_tour · 失败路径自行释放

if ( !xrtNetBufAppendTake(&BufA, pTaken, 2u) ) {
	xrtFree(pTaken);

xrtNetBufAppendRef函数

接管带自定义释放过程的外部数据。

bool xrtNetBufAppendRef(xnetbuf* pBuffer, const void* pData, size_t iSize, xnetreleaseproc pRelease, ptr pContext)

参数

参数方向约束说明
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函数

把一段数据复制到新首块;不移动已有负载块。

bool xrtNetBufPrepend(xnetbuf* pBuffer, const void* pData, size_t iSize)

参数

参数方向约束说明
pBuffer输入输出非空原有块和外部引用保持不动——适合加协议头
pData输入iSize > 0 时非空头内容
iSize输入—字节数
返回值
返回含义失败时状态
true已加首块—
false参数非法或分配失败原数据不变;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • 溢出/分配失败 — 溢出或首块分配失败

范例已编译验证

buf_tour · 加 ">> " 前缀

if ( !xrtNetBufPrepend(&BufA, ">> ", 3u) ||
	(xrtNetBufSize(&BufA) != 14u) ||

xrtNetBufReserve函数

预留至少指定大小的连续尾部可写区。

bool xrtNetBufReserve(xnetbuf* pBuffer, size_t iMinimum, xnetwspan* pSpan)

参数

参数方向约束说明
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函数

提交预留空间中已经写入的字节数。

bool xrtNetBufCommit(xnetbuf* pBuffer, size_t iSize)

参数

参数方向约束说明
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函数

放弃当前写入预留,缓冲内容保持不变。

bool xrtNetBufCancel(xnetbuf* pBuffer)

参数

参数方向约束说明
pBuffer输入输出非空EAGAIN、取消或零字节结果用本接口收尾
返回值
返回含义失败时状态
true预留已放弃(新块释放、登记复原)—
false没有在途预留错误经 xrtGetError() 报告
错误
  • XERR_STATE + XNET_ERROR_BUFFER_STATE — 无预留可放弃

范例已编译验证

buf_tour · Cancel 后总长不变

if ( !xrtNetBufReserve(&BufA, 8u, &Reserve) ||
	!xrtNetBufCancel(&BufA) ||

xrtNetBufMove函数

把源缓冲的全部块移动到目标尾部,源恢复为空但保留池配置。

bool xrtNetBufMove(xnetbuf* pTarget, xnetbuf* pSource)

参数

参数方向约束说明
pTarget输入输出非空接收全部块;只重连块链不复制负载
pSource输出非空恢复为空;AGAIN 或失败时源缓冲保持不变
返回值
返回含义失败时状态
true已转移—
false参数非法(如自移)双方不变;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针或 pTarget == pSource

范例已编译验证

buf_tour · 块链零复制转移

if ( !xrtNetBufAppend(&BufB, "!", 1u) ||
	!xrtNetBufMove(&BufA, &BufB) ||

xrtNetBufPullup函数

确保指定长度的内存前缀连续。

bool xrtNetBufPullup(xnetbuf* pBuffer, size_t iSize, xnetspan* pSpan)

参数

参数方向约束说明
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 — 预留期间操作
  • 溢出/分配失败 — 首块扩容失败

范例已编译验证

buf_tour · 拼合 5 字节协议头

!xrtNetBufPullup(&BufA, 5u, &Span) ||
	(Span.Size < 5u) ||

xrtNetBufPeek函数

从指定偏移复制最多给定字节;不消费。

size_t xrtNetBufPeek(const xnetbuf* pBuffer, size_t iOffset, void* pOutput, size_t iSize)

参数

参数方向约束说明
pBuffer输入非空—
iOffset输入—起始偏移;遇到块边界外的引用段语义见实现(跨块复制、引用块按逻辑长度)
pOutput输出iSize > 0 时非空接收副本
iSize输入—最多复制字节数
返回值
返回含义失败时状态
实际复制数从 iOffset 起的可用前缀参数非法时返回 0 并设置错误
错误
  • XERR_ARGUMENT — 空指针

范例已编译验证

buf_tour · 偏移 8 读 3 字节

(xrtNetBufPeek(&BufA, 8u, arrText, 3u) != 3u) ||

xrtNetBufRead函数

复制并消费:从链首取走最多给定字节。

size_t xrtNetBufRead(xnetbuf* pBuffer, void* pOutput, size_t iSize)

参数

参数方向约束说明
pBuffer输入输出非空已消费部分脱离活动区
pOutput输出iSize > 0 时非空接收副本
iSize输入—请求字节数;可用不足时短读
返回值
返回含义失败时状态
实际读取数短读合法参数非法时返回 0 并设置错误
错误
  • XERR_ARGUMENT — 空指针

范例已编译验证

network/tcp · 基础范例 · 接收队列整段取出

iSize = xrtNetBufRead(pBuffer, Data, sizeof(Data));

xrtNetBufFind函数

从指定偏移查找一个字节,未找到返回 XRT_NPOS。

size_t xrtNetBufFind(const xnetbuf* pBuffer, uint8 iByte, size_t iOffset)

参数

参数方向约束说明
pBuffer输入非空跨块查找
iByte输入—目标字节
iOffset输入—起始偏移
返回值
返回含义
偏移第一个命中位置
XRT_NPOS未命中

范例已编译验证

buf_tour · 命中 'w' 与未命中 'z'

(xrtNetBufFind(&BufA, 'w', 0u) != 9u) ||
	(xrtNetBufFind(&BufA, 'z', 0u) != XRT_NPOS) ||

xrtNetBufConsume函数

消费最多给定字节的前缀。

size_t xrtNetBufConsume(xnetbuf* pBuffer, size_t iSize)

参数

参数方向约束说明
pBuffer输入输出非空不会释放仍被活动写预留借用的尾块;引用块消费到最后一段时执行释放
iSize输入—请求量;允许超过剩余数据(按剩余消费)
返回值
返回含义失败时状态
实际消费量<= iSize 且 <= Size参数非法时返回 0 并设置错误
错误
  • XERR_ARGUMENT — 空指针

范例已编译验证

buf_tour · 消费 ">> " 三字节

(xrtNetBufConsume(&BufA, 3u) != 3u) ||
拥有型字节结果

xrtNetBytesRef函数

增加拥有型网络字节结果的引用并返回原指针。

xnetbytes* xrtNetBytesRef(xnetbytes* pBytes)

参数

参数方向约束说明
pBytes输入非空接收结果(如 xrtNetStreamRecv)的拥有式对象
返回值
返回含义失败时状态
原指针引用已增加;每次成功须一次 xrtNetBytesDestroy 配对—
NULL参数非法错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — pBytes == NULL

范例已编译验证

tcp_stream_tour · 共享持有接收结果

xnetbytes* pShared = xrtNetBytesRef(pBytes);

xrtNetBytesDestroy函数

释放拥有型网络字节结果;空指针视为空操作。

void xrtNetBytesDestroy(xnetbytes* pBytes)

参数

参数方向约束说明
pBytes输入允许空指针最后一个引用释放时对象销毁
返回值
返回含义
无空指针是空操作

范例已编译验证

tcp_stream_tour · 视图取出后释放

xrtNetBytesDestroy(pBytes);

xrtNetBytesView函数

返回拥有型网络字节结果的借用视图。

xbytesview xrtNetBytesView(const xnetbytes* pBytes)

参数

参数方向约束说明
pBytes输入允许空指针空指针返回空视图
返回值
返回含义
视图数据与长度的只读借用;对象销毁后失效

范例已编译验证

tcp_stream_tour · 与期望输出逐位核对

xbytesview View = xrtNetBytesView(pBytes);
地址列表与 DNS

xrtNetAddrListCreate函数

复制、校验并去重调用方地址,建立不可变列表。

xnetaddrlist* xrtNetAddrListCreate(const xnetaddr* pAddresses, size_t iCount)

参数

参数方向约束说明
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函数

复制列表并统一替换端口;端口已一致时只增加引用。

xnetaddrlist* xrtNetAddrListWithPort(xnetaddrlist* pList, uint16 iPort)

参数

参数方向约束说明
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函数

增加不可变列表引用并返回原指针。

xnetaddrlist* xrtNetAddrListRef(xnetaddrlist* pList)

参数

参数方向约束说明
pList输入非空对象内容在全部引用之间只读
返回值
返回含义失败时状态
原指针引用已增加;每次成功须一次 Destroy 配对—
NULL参数非法错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — pList == NULL

范例已编译验证

addr_tour · 共享引用

pRef = xrtNetAddrListRef(pPortList);
if ( pRef != pPortList ) {

xrtNetAddrListDestroy函数

释放列表引用;空指针是空操作。

void xrtNetAddrListDestroy(xnetaddrlist* pList)

参数

参数方向约束说明
pList输入允许空指针最后一个引用释放时对象销毁
返回值
返回含义
无空指针是空操作

范例已编译验证

addr_tour · 引用与原件各自配对释放

xrtNetAddrListDestroy(pRef);
xrtNetAddrListDestroy(pPortList);

xrtNetAddrListCount函数

返回地址数量;空列表返回零。

size_t xrtNetAddrListCount(const xnetaddrlist* pList)

参数

参数方向约束说明
pList输入允许空指针空指针返回 0
返回值
返回含义
数量列表内地址数

范例已编译验证

addr_tour · 见 xrtNetAddrListCreate 范例

(xrtNetAddrListCount(pList) != 2u) ) {

xrtNetAddrListGet函数

返回借用地址;索引越界返回空指针并设置范围错误。

const xnetaddr* xrtNetAddrListGet(const xnetaddrlist* pList, size_t iIndex)

参数

参数方向约束说明
pList输入非空—
iIndex输入< Count0 基索引
返回值
返回含义失败时状态
非空借用地址;视图随列表最后一个引用失效—
NULL越界或参数非法错误经 xrtGetError() 报告
错误
  • XERR_RANGE — iIndex >= Count
  • XERR_ARGUMENT — pList == NULL

范例已编译验证

addr_tour · 读换端口后的首地址

(xrtNetAddrListGet(pPortList, 0u)->Port != 443u) ||

xrtNetLookup函数

解析主机的全部地址;保留系统顺序、去重、端口为零。

xnetaddrlist* xrtNetLookup(cstr sHost, xnetfamily Family)

参数

参数方向约束说明
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函数

解析主机并统一端口。

xnetaddrlist* xrtNetResolve(cstr sHost, uint16 iPort, xnetfamily Family)

参数

参数方向约束说明
sHost输入非空—
iPort输入—写入全部结果的端口
Family输入——
返回值
返回含义失败时状态
非空带端口的列表,配对 Destroy 释放—
NULL解析失败错误经 xrtGetError() 报告
错误
  • 同 xrtNetLookup

范例已编译验证

network/dns · 基础范例 · 完整列表遍历

xnetaddrlist* pList = xrtNetResolve(
	"localhost",
	443,
	XNET_FAMILY_UNSPEC
);

xrtNetResolveOne函数

解析并复制系统顺序中的第一个地址;单地址场景无需管理列表。

bool xrtNetResolveOne(xnetaddr* pAddr, cstr sHost, uint16 iPort, xnetfamily Family)

参数

参数方向约束说明
pAddr输出非空失败不修改
sHost输入非空—
iPort输入—写入端口
Family输入——
返回值
返回含义失败时状态
true已复制首地址—
false解析失败*pAddr 不被修改;错误经 xrtGetError() 报告
错误
  • 同 xrtNetLookup

范例已编译验证

addr_tour · 端口 80 的单地址

if ( !xrtNetResolveOne(&Resolved, "localhost", 80u,
		XNET_FAMILY_IPV4) ||

xrtNetReverse函数

反向解析一个数字地址;成功返回调用方拥有的主机名。

str xrtNetReverse(const xnetaddr* pAddr)

参数

参数方向约束说明
pAddr输入非空只接受数字地址
返回值
返回含义失败时状态
非空拥有式主机名,xrtFree 释放—
NULL反查失败或参数非法错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • XNET_ERROR_DNS_REVERSE — 反查失败

范例已编译验证

addr_tour · 回环地址反查

sHost = xrtNetReverse(&Loopback);
if ( sHost == NULL ) {
Socket 原语

xrtNetSocketOpen函数

打开一个流式或数据报 Socket。

xnetsocket xrtNetSocketOpen(xnetfamily Family, xnetsockettype Type, uint32 iFlags)

参数

参数方向约束说明
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函数

关闭原生句柄并销毁对象;即使系统关闭失败,对象也立即失效。

bool xrtNetSocketClose(xnetsocket Socket)

参数

参数方向约束说明
Socket输入允许空指针(0)空指针是空操作;关闭后句柄不可再用
返回值
返回含义失败时状态
true系统关闭成功或对象为空—
false系统关闭失败对象仍已销毁;错误经 xrtGetError() 报告
错误
  • XNET_ERROR_SOCKET_CLOSE(系统错误)— closesocket() 失败

范例已编译验证

socket_tour · 收尾统一关闭

xrtNetSocketClose(C);
xrtNetSocketClose(L);

xrtNetSocketNative函数

返回借用的原生句柄,调用方不得自行关闭。

intptr_t xrtNetSocketNative(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空—
返回值
返回含义
句柄值平台 SOCKET/fd;所有权仍在 XRT 对象

范例已编译验证

socket_tour · 创建后即验证非零

(xrtNetSocketNative(A) == 0) ||

xrtNetSocketFamily函数

返回 Socket 创建时确定的地址族。

xnetfamily xrtNetSocketFamily(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空—
返回值
返回含义
族枚举与 Open 传入值一致

范例已编译验证

socket_tour · 创建后核对

(xrtNetSocketFamily(A) != XNET_FAMILY_IPV4) ||

xrtNetSocketType函数

返回 Socket 创建时确定的类型。

xnetsockettype xrtNetSocketType(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空—
返回值
返回含义
类型枚举与 Open 传入值一致

范例已编译验证

socket_tour · 与 Family 成对核对

(xrtNetSocketType(A) != XNET_SOCKET_DGRAM) ||

xrtNetSocketSet函数

设置一个通用 Socket 选项。

bool xrtNetSocketSet(xnetsocket Socket, xnetoption Option, int64 iValue)

参数

参数方向约束说明
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 选项。

bool xrtNetSocketGet(xnetsocket Socket, xnetoption Option, int64* pValue)

参数

参数方向约束说明
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函数

查询当前可立即读取的字节数;成功才修改输出。

bool xrtNetSocketAvailable(xnetsocket Socket, size_t* pSize)

参数

参数方向约束说明
Socket输入非空—
pSize输出非空空接收队列上成功返回 0
返回值
返回含义失败时状态
true已写出可读量—
false参数非法或系统失败错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • XNET_ERROR_SOCKET_READ(系统错误)— ioctlsocket/ioctl 失败

范例已编译验证

socket_tour · 空队列上恰为 0

!xrtNetSocketAvailable(A, &iGot) ||
	(iGot != 0u) ) {

xrtNetSocketBind函数

把 Socket 绑定到本地地址;端口为零时由系统分配。

bool xrtNetSocketBind(xnetsocket Socket, const xnetaddr* pAddress)

参数

参数方向约束说明
Socket输入非空—
pAddress输入非空通配地址绑定全部接口;实际端口由 Local 读回
返回值
返回含义失败时状态
true已绑定—
false系统失败错误经 xrtGetError() 报告
错误
  • XNET_ERROR_SOCKET_BIND(系统错误)— bind() 失败(端口占用等)

范例已编译验证

socket_tour · 通配绑定后 Local 读回实际端口

!xrtNetSocketBind(A, &AddrA) ||
	!xrtNetSocketLocal(A, &AddrA) ||

xrtNetSocketListen函数

把已绑定的流式 Socket 转为监听状态。

bool xrtNetSocketListen(xnetsocket Socket, int iBacklog)

参数

参数方向约束说明
Socket输入非空必须已 Bind 且为 STREAM
iBacklog输入> 0等待连接队列长度
返回值
返回含义失败时状态
true已监听—
false系统失败错误经 xrtGetError() 报告
错误
  • XNET_ERROR_SOCKET_LISTEN(系统错误)— listen() 失败

范例已编译验证

network/socket_tcp · 基础范例 · 绑定→监听→接受

!xrtNetSocketListen(Listener, 16) ||

xrtNetSocketAccept函数

接受一个连接;非阻塞 Socket 暂无连接时返回 AGAIN。

xnetresult xrtNetSocketAccept(xnetsocket Socket, xnetsocket* pClient, xnetaddr* pRemote)

参数

参数方向约束说明
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。

xnetresult xrtNetSocketConnect(xnetsocket Socket, const xnetaddr* pRemote)

参数

参数方向约束说明
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,完成非阻塞连接判定。

xnetresult xrtNetSocketFinishConnect(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空处于在途连接的 Socket
返回值
返回含义
XNET_RESULT_OK连接已建立
XNET_RESULT_AGAIN仍在途,继续轮询
XNET_RESULT_ERROR连接被拒或失败(SO_ERROR)
错误
  • XERR_ARGUMENT — 空对象
  • XNET_ERROR_SOCKET_CONNECT(系统错误)— 远端拒绝等

范例已编译验证

socket_tour · 2000ms 轮询收口

Result = xrtNetSocketFinishConnect(Socket);

xrtNetSocketShutdown函数

半关闭指定方向,不销毁 Socket 对象。

bool xrtNetSocketShutdown(xnetsocket Socket, xnetshutdown Direction)

参数

参数方向约束说明
Socket输入非空—
Direction输入READ/WRITE/BOTHWRITE 后对端读到 EOF
返回值
返回含义失败时状态
true已关闭指定方向—
false系统失败对象仍可用;错误经 xrtGetError() 报告
错误
  • XNET_ERROR_SOCKET_SHUTDOWN(系统错误)— shutdown() 失败

范例已编译验证

network/socket_tcp · 基础范例 · 客户端写半关

if ( !xrtNetSocketShutdown(Client, XNET_SHUTDOWN_WRITE) ) {

xrtNetSocketLocal函数

查询实际本地地址。

bool xrtNetSocketLocal(xnetsocket Socket, xnetaddr* pAddress)

参数

参数方向约束说明
Socket输入非空—
pAddress输出非空接收本地地址
返回值
返回含义失败时状态
true已写出—
false系统失败输出不被修改;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • XNET_ERROR_NATIVE(系统错误)— getsockname() 失败

范例已编译验证

socket_tour · 绑定后读回实际端口

!xrtNetSocketLocal(A, &AddrA) ||
	(AddrA.Port == 0u) ||

xrtNetSocketRemote函数

查询已连接的对端地址。

bool xrtNetSocketRemote(xnetsocket Socket, xnetaddr* pAddress)

参数

参数方向约束说明
Socket输入非空须为已连接 Socket
pAddress输出非空接收对端地址
返回值
返回含义失败时状态
true已写出—
false未连接或系统失败输出不被修改;错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • XNET_ERROR_NATIVE(系统错误)— getpeername() 失败

范例已编译验证

socket_tour · 连接后与目标地址全等

!xrtNetSocketRemote(A, &Remote) ||
	!xrtNetAddrEqual(&Remote, &DestB) ) {

xrtNetSocketSend函数

单次发送;允许成功短写,非阻塞无法推进时返回 XNET_RESULT_AGAIN。

xnetresult xrtNetSocketSend(xnetsocket Socket, const void* pData, size_t iSize, size_t* pSent)

参数

参数方向约束说明
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。

xnetresult xrtNetSocketRecv(xnetsocket Socket, void* pData, size_t iSize, size_t* pReceived)

参数

参数方向约束说明
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。

xnetresult xrtNetSocketSendVec(xnetsocket Socket, const xnetspan* pSpans, size_t iCount, size_t* pSent)

参数

参数方向约束说明
Socket输入非空连接式
pSpans输入iCount > 0 时非空只读 Span 数组
iCount输入<= 64Span 数
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。

xnetresult xrtNetSocketRecvVec(xnetsocket Socket, xnetwspan* pSpans, size_t iCount, size_t* pReceived)

参数

参数方向约束说明
Socket输入非空连接式
pSpans输出iCount > 0 时非空可写 Span 数组
iCount输入<= 64Span 数
pReceived输出非空实际读取量
返回值
返回含义
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_CLOSED / XNET_RESULT_ERROR同 Recv
错误
  • XERR_ARGUMENT — 空指针或超限
  • XNET_ERROR_SOCKET_READ(系统错误)

范例已编译验证

socket_tour · 与 SendVec 配对

(xrtNetSocketRecvVec(B, In, 2u, &iGot) != XNET_RESULT_OK) ||

xrtNetSocketSendTo函数

单次发送数据报;允许发送零长度数据报。

xnetresult xrtNetSocketSendTo(xnetsocket Socket, const void* pData, size_t iSize, size_t* pSent, const xnetaddr* pRemote)

参数

参数方向约束说明
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。

xnetresult xrtNetSocketRecvFrom(xnetsocket Socket, void* pData, size_t iSize, size_t* pReceived, xnetaddr* pRemote)

参数

参数方向约束说明
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(系统错误)

范例已编译验证

socket_tour · 多播自收一包

McResult = xrtNetSocketRecvFrom(B, arrBuf, 8u, &iGot,
	&From);

xrtNetSocketSendToVec函数

单次聚集发送数据报;Span 数量不能超过 64。

xnetresult xrtNetSocketSendToVec(xnetsocket Socket, const xnetspan* pSpans, size_t iCount, size_t* pSent, const xnetaddr* pRemote)

参数

参数方向约束说明
Socket输入非空—
pSpans输入iCount > 0 时非空聚集 Span
iCount输入<= 64Span 数
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。

xnetresult xrtNetSocketRecvFromVec(xnetsocket Socket, xnetwspan* pSpans, size_t iCount, size_t* pReceived, xnetaddr* pRemote)

参数

参数方向约束说明
Socket输入非空—
pSpans输出iCount > 0 时非空分散 Span
iCount输入<= 64Span 数
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。

xnetresult xrtNetSocketSendMsg(xnetsocket Socket, const void* pData, size_t iSize, size_t* pSent, const xnetaddr* pRemote, const xnetdgramcontrol* pControl)

参数

参数方向约束说明
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。

xnetresult xrtNetSocketSendMsgVec(xnetsocket Socket, const xnetspan* pSpans, size_t iCount, size_t* pSent, const xnetaddr* pRemote, const xnetdgramcontrol* pControl)

参数

参数方向约束说明
Socket输入非空—
pSpans输入iCount > 0 时非空聚集 Span
iCount输入<= 64Span 数
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 元数据。

xnetresult xrtNetSocketRecvMsg(xnetsocket Socket, void* pData, size_t iSize, size_t* pReceived, xnetaddr* pRemote, xnetdgrammeta* pMeta)

参数

参数方向约束说明
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。

xnetresult xrtNetSocketRecvMsgVec(xnetsocket Socket, xnetwspan* pSpans, size_t iCount, size_t* pReceived, xnetaddr* pRemote, xnetdgrammeta* pMeta)

参数

参数方向约束说明
Socket输入非空—
pSpans输出iCount > 0 时非空分散 Span
iCount输入<= 64Span 数
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。

xnetresult xrtNetSocketRecvBatch(xnetsocket Socket, xnetdgramrecv* pItems, size_t iCapacity, size_t* pReceived)

参数

参数方向约束说明
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 个数据报;返回已经完整发送的输入前缀。

xnetresult xrtNetSocketSendBatch(xnetsocket Socket, const xnetdgramsend* pItems, size_t iCount, size_t* pSent)

参数

参数方向约束说明
Socket输入非空—
pItems输入iCount > 0 时非空调用期间借用数据
iCount输入<= 64发送项数
pSent输出非空已完整发送的项数
返回值
返回含义
XNET_RESULT_OK / XNET_RESULT_AGAIN / XNET_RESULT_ERRORXNET_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函数

返回当前平台和地址族可能提供的数据报接收元数据位。

uint32 xrtNetSocketDgramMetaAvailable(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空—
返回值
返回含义
位集平台可能支持的 XNET_DGRAM_META_* 位组合
错误
  • XNET_ERROR_SOCKET_OPTION(系统错误)— 探测失败

范例已编译验证

socket_tour · 与 Enabled 成对使用(见 DgramMetaSet 范例)

(xrtNetSocketDgramMetaEnabled(A) != 0u) ||

xrtNetSocketDgramMetaEnabled函数

返回 Socket 当前已经启用的数据报接收元数据位。

uint32 xrtNetSocketDgramMetaEnabled(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空—
返回值
返回含义
位集已启用位(默认 0)

范例已编译验证

socket_tour · 默认全零

(xrtNetSocketDgramMetaEnabled(A) != 0u) ||

xrtNetSocketDgramMetaSet函数

成功后精确设置接收元数据位。

bool xrtNetSocketDgramMetaSet(xnetsocket Socket, uint32 iFlags)

参数

参数方向约束说明
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 可用的逐数据报发送控制位。

uint32 xrtNetSocketDgramControlAvailable(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空—
返回值
返回含义
位集可用的 XNET_DGRAM_CONTROL_* 位组合
错误
  • XNET_ERROR_SOCKET_OPTION(系统错误)— 探测失败

范例已编译验证

socket_tour · 与 DgramMetaAvailable 同族用法

(xrtNetSocketDgramMetaEnabled(A) != 0u) ||

xrtNetSocketDgramCapabilities函数

返回 PMTU、错误队列及后续高级数据报能力。

uint32 xrtNetSocketDgramCapabilities(xnetsocket Socket)

参数

参数方向约束说明
Socket输入非空非数据报 Socket 返回零
返回值
返回含义
位集数据报高级能力位;含 XNET_OPTION_DGRAM_ERRORS 可设性等
错误
  • XNET_ERROR_SOCKET_OPTION(系统错误)— 探测失败

范例已编译验证

socket_tour · 同族用法见 DgramMetaSet 范例

(xrtNetSocketDgramMetaEnabled(A) != 0u) ||

xrtNetSocketDgramRecvError函数

非阻塞读取一个已启用的异步数据报错误。

xnetresult xrtNetSocketDgramRecvError(xnetsocket Socket, void* pData, size_t iSize, size_t* pReceived, xnetdgramerror* pError)

参数

参数方向约束说明
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 加入一个同地址族多播组。

bool xrtNetSocketMulticastJoin(xnetsocket Socket, const xnetaddr* pGroup, const xnetaddr* pInterface)

参数

参数方向约束说明
Socket输入非空数据报 Socket
pGroup输入非空、同族多播地址目标组
pInterface输入非空指定出接口;IPv6 使用 Scope 作为接口索引
返回值
返回含义失败时状态
true已加入—
false系统失败错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空指针
  • XNET_ERROR_SOCKET_OPTION(系统错误)— setsockopt(IP_ADD_MEMBERSHIP) 失败

范例已编译验证

socket_tour · Loop+Hop+Iface+Join 全指环回

!xrtNetSocketMulticastJoin(B, &Group, &Iface) ) {

xrtNetSocketMulticastLeave函数

将数据报 Socket 移出一个多播组。

bool xrtNetSocketMulticastLeave(xnetsocket Socket, const xnetaddr* pGroup, const xnetaddr* pInterface)

参数

参数方向约束说明
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 是否接收自己发出的多播报文。

bool xrtNetSocketMulticastLoop(xnetsocket Socket, bool bEnabled)

参数

参数方向约束说明
Socket输入非空—
bEnabled输入—自收开关
返回值
返回含义失败时状态
true已设置—
false系统失败错误经 xrtGetError() 报告
错误
  • XNET_ERROR_SOCKET_OPTION(系统错误)— IP_MULTICAST_LOOP 失败

范例已编译验证

socket_tour · 自收前提

!xrtNetSocketMulticastLoop(A, true) ||

xrtNetSocketMulticastHopLimit函数

设置数据报 Socket 的多播跳数,合法范围为 0 到 255。

bool xrtNetSocketMulticastHopLimit(xnetsocket Socket, int iHopLimit)

参数

参数方向约束说明
Socket输入非空—
iHopLimit输入[0, 255]多播 TTL
返回值
返回含义失败时状态
true已设置—
false系统失败错误经 xrtGetError() 报告
错误
  • XNET_ERROR_SOCKET_OPTION(系统错误)— IP_MULTICAST_TTL 失败

范例已编译验证

socket_tour · 单跳自收

!xrtNetSocketMulticastHopLimit(A, 1) ||

xrtNetSocketMulticastInterface函数

选择多播发送接口;空接口恢复系统默认。

bool xrtNetSocketMulticastInterface(xnetsocket Socket, const xnetaddr* pInterface)

参数

参数方向约束说明
Socket输入非空—
pInterface输入允许空指针空恢复默认;IPv6 使用 Scope 接口索引
返回值
返回含义失败时状态
true已设置—
false系统失败错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 空对象
  • XNET_ERROR_SOCKET_OPTION(系统错误)— IP_MULTICAST_IF 失败

范例已编译验证

socket_tour · 设环回接口并在收尾恢复默认

!xrtNetSocketMulticastInterface(A, &Iface) ||
Readiness 与 Completion

xrtNetPortConfigInit函数

初始化端口配置为默认值:Backend=AUTO、PostLimit=4096、WatchLimit=0、OperationLimit=0、OperationCache=64。

void xrtNetPortConfigInit(xnetportconfig* pConfig)

参数

参数方向约束说明
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,不会静默换后端。

xnetport* xrtNetPortCreate(const xnetportconfig* pConfig)

参数

参数方向约束说明
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,再销毁端口、观察、用户事件及唤醒资源;返回后系统不再引用任何调用方缓冲。只能由拥有线程调用。

bool xrtNetPortDestroy(xnetport* pPort)

参数

参数方向约束说明
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函数

返回端口实际启用的后端。

xnetportbackend xrtNetPortBackend(const xnetport* pPort)

参数

参数方向约束说明
pPort输入非空端口指针
返回值
返回含义
XNET_PORT_AUTOpPort 为空(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 容量和实际后端的有效配置。返回值是副本,修改它不影响端口。

bool xrtNetPortGetConfig(const xnetport* pPort, xnetportconfig* pConfig)

参数

参数方向约束说明
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"),字符串存活期与进程相同。

cstr xrtNetPortName(const xnetport* pPort)

参数

参数方向约束说明
pPort输入非空端口指针
返回值
返回含义
非空 cstr静态后端名称
NULLpPort 为空
错误
  • XERR_ARGUMENT — pPort 为空

范例已编译验证

network/port_iocp · 完成式 · 诊断输出中打印后端名

printf("backend=%s bytes=%zu data=%s\n",
	xrtNetPortName(pPort), Events[i].Bytes, sData);

xrtNetPortCapabilities函数

返回实际后端能力位(XNET_PORT_CAP_* 的按位或)。

uint32 xrtNetPortCapabilities(const xnetport* pPort)

参数

参数方向约束说明
pPort输入非空端口指针
返回值
返回含义
能力位组合READINESS/COMPLETION/ONESHOT/EDGE/BATCH/WAKE/POST/CANCEL/READ_PROBE 的按位或
0pPort 为空(无后端具备零能力,可作失败哨兵)
错误
  • 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)转移给调用方,调用方成为其唯一拥有者。

bool xrtNetPortAccept(xnetport* pPort, xnetsocket Socket, uint64 Id, ptr pUser)

参数

参数方向约束说明
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 — 在途操作数达到 OperationLimit
  • XERR_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 必须保持有效。

bool xrtNetPortConnect(xnetport* pPort, xnetsocket Socket, const xnetaddr* pRemote, uint64 Id, ptr pUser)

参数

参数方向约束说明
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 — 在途操作数达到 OperationLimit
  • XERR_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 等由上层状态机驱动读取的场景。

bool xrtNetPortReadProbe(xnetport* pPort, xnetsocket Socket, uint64 Id, ptr pUser)

参数

参数方向约束说明
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 — 在途操作数达到 OperationLimit
  • XERR_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,错误集与之相同。

bool xrtNetPortRecv(xnetport* pPort, xnetsocket Socket, void* pData, size_t iSize, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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 字节。

bool xrtNetPortRecvVec(xnetport* pPort, xnetsocket Socket, const xnetwspan* pSpans, size_t iCount, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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,错误集与之相同。

bool xrtNetPortSend(xnetport* pPort, xnetsocket Socket, const void* pData, size_t iSize, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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 字节。

bool xrtNetPortSendVec(xnetport* pPort, xnetsocket Socket, const xnetspan* pSpans, size_t iCount, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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,错误集与之相同。

bool xrtNetPortRecvFrom(xnetport* pPort, xnetsocket Socket, void* pData, size_t iSize, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_STATE — 从非拥有线程调用

范例已编译验证

network/port_iocp · 完成式 · 终态事件带来源地址

!xrtNetPortRecvFrom(pPort, Server,
	sData, sizeof(sData) - 1, 1, NULL) ||

xrtNetPortRecvFromVec函数

异步分散接收数据报;缓冲不足由终态事件返回 TRUNCATED,Bytes 保留实际写入长度。

bool xrtNetPortRecvFromVec(xnetport* pPort, xnetsocket Socket, const xnetwspan* pSpans, size_t iCount, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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,错误集与之相同。

bool xrtNetPortRecvMsg(xnetport* pPort, xnetsocket Socket, void* pData, size_t iSize, uint64 Id, ptr pUser)

参数

参数方向约束说明
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(拥有线程)— 同 RecvVec
  • XERR_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。

bool xrtNetPortRecvMsgVec(xnetport* pPort, xnetsocket Socket, const xnetwspan* pSpans, size_t iCount, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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 已启用数据报错误队列,且后端支持等待该队列。

bool xrtNetPortRecvError(xnetport* pPort, xnetsocket Socket, void* pData, size_t iSize, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_STATE — 从非拥有线程调用

范例已编译验证

network/port_tour · 平台门控 · Windows IOCP 上提交被拒是预期行为

if ( xrtNetPortRecvError(pIocp, UdpA, arrBuf, 16u, 300u, NULL) ) {
	goto Cleanup;
}

xrtNetPortSendTo函数

异步发送数据报;远端地址在提交时复制,提交返回后可立即复用地址对象。等价于单跨度 SendToVec,错误集与之相同。

bool xrtNetPortSendTo(xnetport* pPort, xnetsocket Socket, const void* pData, size_t iSize, const xnetaddr* pRemote, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_STATE — 从非拥有线程调用

范例已编译验证

network/port_uring · 完成式 · 提交后地址对象即可复用

!xrtNetPortSendTo(
	pPort,
	Client,
	"completion",
	10,
	&Address,
	2,
	NULL
 ) ||

xrtNetPortSendToVec函数

异步聚集发送数据报;远端地址和 Span 描述符在提交时复制。

bool xrtNetPortSendToVec(xnetport* pPort, xnetsocket Socket, const xnetspan* pSpans, size_t iCount, const xnetaddr* pRemote, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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,错误集与之相同。

bool xrtNetPortSendMsg(xnetport* pPort, xnetsocket Socket, const void* pData, size_t iSize, const xnetaddr* pRemote, const xnetdgramcontrol* pControl, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_STATE — 从非拥有线程调用

范例已编译验证

network/port_iocp · 完成式 · 逐包覆盖源地址发送

!xrtNetPortSendMsg(pPort, Client,
	"completion", 10, &Address, &Control, 2, NULL) ||

xrtNetPortSendMsgVec函数

异步聚集发送带逐包控制的数据报;Span 描述符、地址和控制值在提交时复制。终态类型与 SendMsg 相同。

bool xrtNetPortSendMsgVec(xnetport* pPort, xnetsocket Socket, const xnetspan* pSpans, size_t iCount, const xnetaddr* pRemote, const xnetdgramcontrol* pControl, uint64 Id, ptr pUser)

参数

参数方向约束说明
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_MAX
  • XERR_UNSUPPORTED + XNET_ERROR_PORT_SUBMIT — 后端没有 completion 能力
  • XERR_AGAIN + XNET_ERROR_PORT_SUBMIT — 在途操作数达到 OperationLimit
  • XERR_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,完成先于取消发生时仍是原完成。

bool xrtNetPortCancel(xnetport* pPort, uint64 Id)

参数

参数方向约束说明
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) ) {
观察与等待(readiness)

xrtNetPortWatch函数

替换一个 Socket 的 readiness 关注位;事件为零等价于 Unwatch。每 Socket 单份观察,重复 Watch 覆盖旧关注位与事件身份。

bool xrtNetPortWatch(xnetport* pPort, xnetsocket Socket, uint64 Id, uint32 iEvents, ptr pUser)

参数

参数方向约束说明
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。

bool xrtNetPortUnwatch(xnetport* pPort, xnetsocket Socket)

参数

参数方向约束说明
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。只能由拥有线程调用。

xnetresult xrtNetPortWait(xnetport* pPort, xnetportevent* pEvents, size_t iCapacity, int64 iTimeout, size_t* 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 原样进入事件。

bool xrtNetPortPost(xnetport* pPort, uint64 Id, ptr 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 事件;连续请求只产生一个事件。适合“命令队列已有工作”式通知。

bool xrtNetPortWake(xnetport* pPort)

参数

参数方向约束说明
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;清零节点并写入内部魔数。

bool xrtNetPostInit(xnetpost* pPost)

参数

参数方向约束说明
pPost输出非空嵌入调用方结构的 xnetpost
返回值
返回含义失败时状态
true节点已就绪,可投递—
falsepPost 非法错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — pPost 为空或范围非法

范例已编译验证

network/engine_tour · 嵌入式 Post · 初始化后立即投递

if ( !xrtNetPostInit(&Post) ||
	!xrtNetPost(pWorker0, &Post,
		exampleSimpleTask, (ptr)&bTaskDone) ) {
	goto Cleanup;
}

xrtNetPostPending函数

判断嵌入式 Post 是否仍在 Worker 队列中等待执行;执行完成后清除。

bool xrtNetPostPending(const xnetpost* pPost)

参数

参数方向约束说明
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 自身线程调用时直接入队不阻塞,跨线程投递经有界提交段进入。受理失败时节点状态回滚,不留半提交状态。

bool xrtNetPost(xnetworker* pWorker, xnetpost* pPost, xnettaskproc pProc, ptr pData)

参数

参数方向约束说明
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 默认配置(见上表)。

void xrtNetEngineConfigInit(xnetengineconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收默认配置
返回值
返回含义
无纯初始化,不失败

范例已编译验证

network/engine_tour · 生命周期 · 覆盖 Worker 数后创建

xrtNetEngineConfigInit(&Config);
Config.Workers = 2;
pEngine = xrtNetEngineCreate(&Config);

xrtNetEngineCreate函数

创建停止状态的 Engine;Worker 线程和端口在 Start 时建立。BufferPool 指向的配置在返回前完整复制。

xnetengine* xrtNetEngineCreate(const xnetengineconfig* pConfig)

参数

参数方向约束说明
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,允许重试。

bool xrtNetEngineStart(xnetengine* pEngine)

参数

参数方向约束说明
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 仍进入可重启的停止状态。

bool xrtNetEngineStop(xnetengine* pEngine)

参数

参数方向约束说明
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;仍有高层对象或外借池块时失败并保留对象。

bool xrtNetEngineDestroy(xnetengine* pEngine)

参数

参数方向约束说明
pEngine输入允许空指针空指针是空操作;运行中会先执行停止流程
返回值
返回含义失败时状态
trueEngine 已销毁—
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函数

返回当前生命周期状态,可安全跨线程查询。

xnetenginestate xrtNetEngineState(const xnetengine* pEngine)

参数

参数方向约束说明
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 配对释放。

bool xrtNetEnginePin(xnetengine* pEngine)

参数

参数方向约束说明
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 生命周期占用;没有匹配占用时返回状态错误。

bool xrtNetEngineUnpin(xnetengine* pEngine)

参数

参数方向约束说明
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;
}
Worker 与任务

xrtNetEngineWorkerCount函数

返回 Engine 固定的 Worker 数量。

uint32 xrtNetEngineWorkerCount(const xnetengine* pEngine)

参数

参数方向约束说明
pEngine输入允许空指针空指针返回 0
返回值
返回含义
> 0Worker 数;创建后固定,跨 Stop/Start 不变
0pEngine 为空

范例已编译验证

network/engine_tour · 生命周期 · 显式 2 Worker

if ( (xrtNetEngineWorkerCount(pEngine) != 2u) ||
	((pWorker0 = xrtNetEngineWorker(pEngine, 0u)) == NULL) ||

xrtNetEngineWorker函数

返回借用的指定 Worker;索引越界时返回空指针。

xnetworker* xrtNetEngineWorker(xnetengine* pEngine, uint32 iIndex)

参数

参数方向约束说明
pEngine输入非空Engine 指针
iIndex输入< WorkerCountWorker 索引
返回值
返回含义失败时状态
非空借用 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 时返回空指针。

xnetworker* xrtNetEngineCurrent(xnetengine* pEngine)

参数

参数方向约束说明
pEngine输入允许空指针空指针返回 NULL
返回值
返回含义
非空当前线程正是该 Worker(在其回调内调用)
NULL当前线程不属于该 Engine(如外部主线程)
错误
  • 无 — 不属于任何 Worker 是查询结果而非错误,不设置线程错误

范例已编译验证

network/engine_tour · 生命周期 · 主线程不属于任何 Worker

(xrtNetEngineWorker(pEngine, 99u) != NULL) ||
/* 主线程不属于任何 Worker → Current 为空。 */
(xrtNetEngineCurrent(pEngine) != NULL) ) {
	goto Cleanup;
}

xrtNetWorkerEngine函数

返回 Worker 所属的借用 Engine。

xnetengine* xrtNetWorkerEngine(const xnetworker* pWorker)

参数

参数方向约束说明
pWorker输入允许空指针空指针返回 NULL
返回值
返回含义
非空所属 Engine(借用)
NULLpWorker 为空
错误
  • 无 — 空指针返回 NULL,不设置线程错误

范例已编译验证

network/engine_tour · Worker 自省 · 回调内反查 Engine

pTask->bEngineOk =
	(xrtNetWorkerEngine(pWorker) == pTask->pEngine);

xrtNetWorkerIndex函数

返回 Worker 在所属 Engine 内的稳定索引。

uint32 xrtNetWorkerIndex(const xnetworker* pWorker)

参数

参数方向约束说明
pWorker输入非空Worker 指针
返回值
返回含义
[0, WorkerCount)稳定索引,跨 Stop/Start 不变
UINT32_MAXpWorker 为空
错误
  • XERR_ARGUMENT — pWorker 为空(返回 UINT32_MAX)

范例已编译验证

network/engine_tour · Worker 自省 · 回调内核对亲和索引

pTask->bIndexOk = (xrtNetWorkerIndex(pWorker) == 0u);

xrtNetWorkerIsCurrent函数

判断调用线程是否正是指定 Worker。

bool xrtNetWorkerIsCurrent(const xnetworker* pWorker)

参数

参数方向约束说明
pWorker输入允许空指针空指针返回 false
返回值
返回含义
true当前线程正是该 Worker
false不是,或 pWorker 为空
错误
  • 无 — 否定回答与空指针都是查询结果,不设置线程错误

范例已编译验证

network/engine_tour · Worker 自省 · 回调内确认自身

pTask->bIsCurrent = xrtNetWorkerIsCurrent(pWorker);

xrtNetWorkerPort函数

返回运行期间借用的端口;调用方必须保证借用操作先于 Stop 结束。

xnetport* xrtNetWorkerPort(xnetworker* pWorker)

参数

参数方向约束说明
pWorker输入非空运行中的 Worker
返回值
返回含义失败时状态
非空借用端口;除跨线程明确允许的操作外应在所属 Worker 使用—
NULLWorker 未运行XERR_STATE(未运行时设置)
错误
  • XERR_STATE + XNET_ERROR_ENGINE_POST — Worker 未运行(Stop 后端口已释放)

范例已编译验证

network/engine_tour · Worker 自省 · 回调内取端口

pTask->bPortOk = (xrtNetWorkerPort(pWorker) != NULL);

xrtNetWorkerBufPool函数

返回 Worker 独占的自适应缓冲池;只能从该 Worker 的回调中调用。

xnetbufpool* xrtNetWorkerBufPool(xnetworker* pWorker)

参数

参数方向约束说明
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 生命周期有效。

ptr xrtNetWorkerAlloc(xnetworker* pWorker, size_t iSize)

参数

参数方向约束说明
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;空指针可以直接释放。

void xrtNetWorkerFree(xnetworker* pWorker, ptr pMemory, size_t iSize)

参数

参数方向约束说明
pWorker输入非空必须与分配时的 Worker 相同
pMemory输入允许空指针Alloc 返回的块;空指针为空操作
iSize输入同分配时必须传回原始请求大小
返回值
返回含义
无小节点回缓存,大节点直接释放

范例已编译验证

network/engine_tour · Worker 自省 · 原始大小配对归还

xrtNetWorkerFree(pWorker, pBlock, 32u);
pTask->bFreeOk = true;

xrtNetWorkerOperationId函数

分配 Engine 内唯一的非零端口操作 ID,可从任意线程调用。

uint64 xrtNetWorkerOperationId(xnetworker* pWorker)

参数

参数方向约束说明
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)上执行一次。

bool xrtNetEnginePost(xnetengine* pEngine, uint64 iAffinity, xnettaskproc pProc, ptr pData)

参数

参数方向约束说明
pEngine输入非空运行中的 Engine
iAffinity输入任意值亲和键;按模 Worker 数选目标
pProc输入非空任务回调,短小非阻塞
pData输入任意值原样传给回调
返回值
返回含义失败时状态
true已受理;含与 Stop 并发时也必执行一次—
false未受理,不留任务错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — pEngine/pProc 为空
  • XERR_CLOSED + XNET_ERROR_ENGINE_POST — Engine 未运行或停机封口已触发
  • XERR_AGAIN — 目标 Worker 命令队列达到 CommandCapacity
  • XERR_INTERNAL — Worker 唤醒失败

范例已编译验证

network/engine_tour · 任务 · 投递到 0 号亲和并自旋等待

if ( !xrtNetEnginePost(pEngine, 0u, exampleWorkerTask,
		(ptr)&Task) ||
	!exampleSpinUntil(&Task.bDone, 2000u) ||
Timer

xrtNetEngineSchedule函数

按单调时钟截止时间调度 Timer;成功返回非零 ID。

uint64 xrtNetEngineSchedule(xnetengine* pEngine, uint64 iAffinity, int64 iTimeout, xnettimerproc pProc, ptr pData)

参数

参数方向约束说明
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 数达到 TimerLimit
  • XERR_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,错误集与之相同。

uint64 xrtNetEngineAfter(xnetengine* pEngine, uint64 iAffinity, int64 iTimeout, xnettimerproc pProc, ptr pData)

参数

参数方向约束说明
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。

bool xrtNetEngineTimerCancel(xnetengine* pEngine, uint64 Id)

参数

参数方向约束说明
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,且不修改线程错误。

bool xrtNetEngineTimerCancelCurrent(xnetengine* pEngine, uint64 Id)

参数

参数方向约束说明
pEngine输入非空Timer 所属 Engine
Id输入非零要取消的 Timer ID
返回值
返回含义失败时状态
true已取消;终态回调以 CANCELLED 触发—
false不在所属 Worker、尚未入堆或已终结不修改线程错误
错误
  • 无 — 失败路径刻意不设置错误(调用方可先试本函数,失败再走 TimerCancel)

范例已编译验证

network/engine_tour · CancelCurrent · 同亲和回调内取消另一个 Timer

pTimers->bCancelCurrentOk = xrtNetEngineTimerCancelCurrent(
	xrtNetWorkerEngine(pWorker), pTimers->iLongId);
Completion

xrtNetCompletionInit函数

初始化一个借用过程和数据的端口 Completion;空指针是空操作,不设置错误。

void xrtNetCompletionInit(xnetcompletion* pCompletion, xnetcompletionproc pProc, ptr pData)

参数

参数方向约束说明
pCompletion输出建议非空调用方拥有的 Completion;空指针是空操作
pProc输入可空终态回调 Proc(worker, event, data),在所属 Worker 上执行
pData输入任意值原样传给回调
返回值
返回含义
无纯初始化;存活期约束见上文 Completion 契约
错误
  • 无 — 初始化不失败,空指针静默忽略

范例已编译验证

network/engine_tour · Completion · 借用过程与数据的初始化形态

xrtNetCompletionInit(&Completion, exampleCompletionProc,
	(ptr)&bTaskDone);
统计

xrtNetWorkerStats函数

读取一个 Worker 的统计快照。

bool xrtNetWorkerStats(const xnetworker* pWorker, xnetworkerstats* pStats)

参数

参数方向约束说明
pWorker输入非空目标 Worker
pStats输出非空接收并发快照
返回值
返回含义失败时状态
true快照已写入—
false参数非法错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 任一指针为空

范例已编译验证

network/engine_tour · 统计 · 任务执行后核对计数

if ( !xrtNetWorkerStats(pWorker0, &WorkerStats) ||
	(WorkerStats.PostsExecuted < 1u) ) {
	goto Cleanup;
}

xrtNetEngineStats函数

聚合全部 Worker 的统计快照。

bool xrtNetEngineStats(const xnetengine* pEngine, xnetenginestats* pStats)

参数

参数方向约束说明
pEngine输入非空Engine 指针
pStats输出非空接收聚合快照
返回值
返回含义失败时状态
true聚合快照已写入—
false参数非法错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 任一指针为空

范例已编译验证

network/engine_tour · 统计 · 全 Worker 聚合计数

if ( !xrtNetEngineStats(pEngine, &EngineStats) ||
	(EngineStats.PostsExecuted < 2u) ||
	(EngineStats.TimersFired < 2u) ) {
	goto Cleanup;
}
名称解析(Resolver)

xrtNetResolverConfigInit函数

写入兼顾桌面与高并发服务的默认配置:Workers=2、RequestLimit=8192、QueryLimit=4096、CacheEntries=256、SuccessTTL=60s、FailureTTL=5s、HostLimit=1024。

void xrtNetResolverConfigInit(xnetresolverconfig* pConfig)

参数

参数方向约束说明
pConfig输出建议非空接收默认配置;空指针是空操作
返回值
返回含义
无纯初始化,不失败

范例已编译验证

network/resolve_tour · 创建 · 初始化后直接创建

xrtNetResolverConfigInit(&Config);
pResolver = xrtNetResolverCreate(&Config);

xrtNetResolverCreate函数

创建并立即启动独立解析工作池;空配置使用默认值(内部先取默认再整体复制调用方配置)。

xnetresolver* xrtNetResolverCreate(const xnetresolverconfig* pConfig)

参数

参数方向约束说明
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 所有者操作串行,返回后指针失效。

bool xrtNetResolverDestroy(xnetresolver* pResolver)

参数

参数方向约束说明
pResolver输入允许空指针空指针是空操作
返回值
返回含义失败时状态
true已排空并销毁—
false参数非法、状态非法或回调内部失败错误经 xrtGetError() 报告
错误
  • XERR_STATE + XNET_ERROR_RESOLVER_CLOSED — 从 Resolver 自己的 Worker 回调内调用,或已在关闭/已销毁

范例已编译验证

network/resolve_tour · 收尾 · 销毁失败以退出码暴露

if ( (pResolver != NULL) &&
	!xrtNetResolverDestroy(pResolver) ) {
	iResult = 2;
}

xrtNetResolverResolve函数

提交主机查询;同一规范化主机与地址族只执行一次底层查询,命中缓存立即返回已关联的 Op。

xnetresolveop* xrtNetResolverResolve(xnetresolver* pResolver, cstr sHost, xnetfamily Family, xnetresolveproc pDone, ptr pData)

参数

参数方向约束说明
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 — 主机名超过 HostLimit
  • XERR_AGAIN + XNET_ERROR_RESOLVER_SUBMIT — 在途请求达到 RequestLimit,或唯一查询数达到 QueryLimit

范例已编译验证

network/resolve_tour · 查询 · 提交 localhost 并核对初始状态

pOperation = xrtNetResolverResolve(pResolver, "localhost",
	XNET_FAMILY_IPV4, exampleResolveDone, (ptr)&State);

xrtNetResolverClear函数

清空成功和失败缓存;已经运行或排队的查询不受影响。

bool xrtNetResolverClear(xnetresolver* pResolver)

参数

参数方向约束说明
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 的并发一致统计快照。

bool xrtNetResolverStats(const xnetresolver* pResolver, xnetresolverstats* pStats)

参数

参数方向约束说明
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(回调后仍要查询)必须先取引用。

xnetresolveop* xrtNetResolveOpRef(xnetresolveop* pOperation)

参数

参数方向约束说明
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函数

释放解析操作引用;空指针视为空操作。归零时释放操作与关联结果。

void xrtNetResolveOpDestroy(xnetresolveop* pOperation)

参数

参数方向约束说明
pOperation输入允许空指针要释放引用的操作
返回值
返回含义
无空指针是空操作

范例已编译验证

network/resolve_tour · OpRef · 每份引用各自配对销毁

xrtNetResolveOpDestroy(pRef);
xrtNetResolveOpDestroy(pOperation);

xrtNetResolveOpCancel函数

协作取消尚未进入终态的操作;回调仍在 Resolver Worker 上执行一次(以 CANCELLED 终态)。

bool xrtNetResolveOpCancel(xnetresolveop* pOperation)

参数

参数方向约束说明
pOperation输入非空要取消的操作
返回值
返回含义失败时状态
true取消请求已受理(或查询组已在取消)—
false参数非法或操作已进入终态参数非法时错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — pOperation 为空
  • 无额外错误 — 已终态的取消失败是查询结果,不设置错误

范例已编译验证

network/resolver · 超时取消 · 等待截止后协作取消

if ( (xrtTimer() >= iDeadline) ) {
	(void)xrtNetResolveOpCancel(pOperation);
	break;
}

xrtNetResolveOpState函数

返回解析操作当前状态的原子快照。

xnetresolveopstate xrtNetResolveOpState(const xnetresolveop* pOperation)

参数

参数方向约束说明
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函数

成功时返回增加引用的完整地址列表,其他状态返回空指针并设置对应错误。

xnetaddrlist* xrtNetResolveOpResult(const xnetresolveop* pOperation)

参数

参数方向约束说明
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函数

失败或取消时返回借用的结构化错误,其他状态返回空指针。

const xerror* xrtNetResolveOpError(const xnetresolveop* pOperation)

参数

参数方向约束说明
pOperation输入非空解析操作
返回值
返回含义失败时状态
非空借用的 xerror,存活到操作销毁;不转移所有权—
NULL非失败/取消状态非错误状态,不设置线程错误
错误
  • 无 — 空返回是状态查询结果而非错误

范例已编译验证

network/resolver · 失败路径 · 借用错误打印消息

const xerror* pError = xrtNetResolveOpError(pOperation);

fprintf(stderr, "%s\n", pError != NULL ?
	xrtErrorMessage(pError) : "resolve failed");

xrtNetResolveAsync函数

把 Resolver 查询包装为 Future;成功值是由 Future 持有的地址列表。

xfuture* xrtNetResolveAsync(xnetresolver* pResolver, cstr sHost, xnetfamily Family)

参数

参数方向约束说明
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函数

契约注释见公共头文件。

XRT_API xrtownershipref xrtNetAddrListOwnership(const xnetaddrlist* pList)

xrtNetAddrListOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtNetAddrListOwnershipAdapterV1(xrtownershipref Reference)

xrtNetResolverCreateOwnedV1函数

契约注释见公共头文件。

XRT_API xnetresolver* xrtNetResolverCreateOwnedV1(const xnetresolverconfig* pConfig, ptr pData, const xnetresolverlookupownershipv1* pPolicy)

xrtNetResolverTryDestroy函数

契约注释见公共头文件。

XRT_API xnetretireresult xrtNetResolverTryDestroy(xnetresolver* pResolver)

xrtNetResolverResolveOwnedV1函数

契约注释见公共头文件。

XRT_API xnetresolveop* xrtNetResolverResolveOwnedV1(xnetresolver* pResolver, cstr sHost, xnetfamily Family, ptr pData, const xnetresolveownershipv1* pPolicy)

xrtNetResolverOwnership函数

契约注释见公共头文件。

XRT_API xrtownershipref xrtNetResolverOwnership(const xnetresolver* pResolver)

xrtNetResolveOpOwnership函数

契约注释见公共头文件。

XRT_API xrtownershipref xrtNetResolveOpOwnership(const xnetresolveop* pOperation)

xrtNetResolverOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtNetResolverOwnershipAdapterV1(xrtownershipref Reference, const xnetresolverlookupownershipv1* const* pPolicies, size_t iPolicyCount, const xrtownershippreparationv1** ppPreparation)

xrtNetResolveOpOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtNetResolveOpOwnershipAdapterV1(xrtownershipref Reference, const xnetresolveownershipv1* const* pPolicies, size_t iPolicyCount, const xrtownershippreparationv1** ppPreparation)

xrtNetResolverFutureProducerPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xfutureproducerownershipv1* xrtNetResolverFutureProducerPolicyV1Get()

xrtNetResolverFutureCancelPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xcancelwatchownershipv1* xrtNetResolverFutureCancelPolicyV1Get()

xrtNetResolverFutureRequestPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xnetresolveownershipv1* xrtNetResolverFutureRequestPolicyV1Get()

xrtNetResolverFuturePayloadPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xfuturepayloadownershipv1* xrtNetResolverFuturePayloadPolicyV1Get()

xrtNetResolverFutureOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtNetResolverFutureOwnershipAdapterV1(xrtownershipref Reference, const xrtownershippreparationv1** ppPreparation)

xrtNetEngineOwnership函数

契约注释见公共头文件。

XRT_API xrtownershipref xrtNetEngineOwnership(const xnetengine* pEngine)

xrtNetEngineOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtNetEngineOwnershipAdapterV1(xrtownershipref Reference, const xnettaskownershipv1* const* pTaskPolicies, size_t iTaskPolicyCount, const xnettimerownershipv1* const* pTimerPolicies, size_t iTimerPolicyCount, const xrtownershippreparationv1** ppPreparation)

xrtNetEnginePostOwnedV1函数

契约注释见公共头文件。

XRT_API bool xrtNetEnginePostOwnedV1(xnetengine* pEngine, uint64 iAffinity, ptr pData, const xnettaskownershipv1* pPolicy)

xrtNetEngineScheduleOwnedV1函数

契约注释见公共头文件。

XRT_API uint64 xrtNetEngineScheduleOwnedV1(xnetengine* pEngine, uint64 iAffinity, int64 iTimeout, ptr pData, const xnettimerownershipv1* pPolicy)

xrtNetEngineTryDestroy函数

契约注释见公共头文件。

XRT_API xnetretireresult xrtNetEngineTryDestroy(xnetengine* pEngine)

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
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见头文件注释