豫言操作系统底层接口之网络(可选能力):TCP 的监听、连接与接受;数据收发用句柄包。
源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。
# 豫言操作系统底层网络 0.1.0 状态:草案,可选能力。文言本见[文言版](规范.文言.md)。通用规则见[调用约定](../调用约定.汉语.md),状态码表见[底层基础](../底层基础/规范.汉语.md),数据收发与等待见[底层句柄](../底层句柄/规范.汉语.md)。 ## 范围 TCP 的监听、连接与接受。数据收发、等待、关闭都用底层句柄的 `读`、`写`、`等待`、`关闭`:套接字是可读写的句柄(类别 6)。平台没有网络时,本包所有函数返回 58;裸机目前没有网络栈,属于这种情况。不含 UDP、TLS、域名解析接口与套接字选项(除 `设无延迟`);HTTP 与 TLS 由 shim 在 TCP 之上用豫言实现。 ## 流程 **服务端。** `监听` 得到监听句柄;用 `等待`(可读)得知有待接受的连接;`接受` 得到连接句柄。 **客户端。** `连接开始` 立即返回一个非阻塞的连接句柄(域名解析可能在此期间阻塞,首版接受这一点);用 `等待`(可写)等连接完成;`连接完成` 取得结果:状态码 0 表示已连上,否则是失败原因(14 连接被拒、73 超时、……)。 **收发。** 连接句柄用 `读`、`写`:读得 0 表示对端有序关闭;对端重置返回 15;写到已关闭的连接返回 64。`关闭写` 只关写方向,对端读到文件尾,本端仍可读。`关闭` 释放句柄。 新接受的连接句柄默认阻塞;需要非阻塞时用 `设非阻塞`。 ## 函数(`网络。接口。豫`) | 函数 | 参数 | 作用 | | --- | --- | --- | | 监听 | 主机址, 主机长, 端口, 队列长, 出 | 在(主机,端口)上监听;主机为空串表示任意地址;监听句柄 4 字节写入出址;地址已用返回 3 | | 连接开始 | 主机址, 主机长, 端口, 出 | 开始连接,非阻塞;主机可以是名字或数字地址;句柄 4 字节写入出址 | | 连接完成 | 句柄 | 取得连接结果,状态码即结果;连接尚未完成返回 6 | | 接受 | 监听句柄, 出 | 新连接句柄 4 字节写入出址;非阻塞且没有待接受的连接返回 6 | | 关闭写 | 句柄 | 半关闭 | | 取本地端口 | 句柄, 出 | 本地端口,4 字节(监听时端口为 0 的场合用它取得实际端口) | | 设无延迟 | 句柄, 开关 | 开关 1 置无延迟(关闭 Nagle),0 取消 | ## 平台注记 - 桌面:BSD 套接字(Linux、macOS)与 ws2_32(Windows);IPv4 与 IPv6 由平台决定;`监听` 的主机串为空时监听双栈或任意地址。 - 与标准库现有的传输控制协议原语(14 个,`豫言_传输控制协议_*`)一一可以由本包加底层句柄实现:监听、开始连接、完成连接、接受、读取、写入、等待、获取本地端口、设置无延迟、关闭写入、关闭。
# 豫言操作系统底层网络〇点一点〇 状:草案,可选之能。汉语本见[汉语版](规范.汉语.md)。通用之规,见[调用约定](../调用约定.文言.md);状态之码表,见[底层基础](../底层基础/规范.文言.md);数据之收发与等待,见[底层句柄](../底层句柄/规范.文言.md)。 ## 范围 TCP 之监听、连接与接受。数据之收发、等待、关闭,皆用底层句柄之 `读`、`写`、`等待`、`关闭`:套接字乃可读写之柄(类别 6)。平台无网络,则本包诸函数皆返 58;裸机今无网络栈,即此情形。不含 UDP、TLS、域名解析之接口与套接字之选项(唯 `设无延迟` 除外);HTTP 与 TLS,由垫层于 TCP 之上以豫言为之。 ## 流程 **服务端。** `监听` 得监听之柄;以 `等待`(可读)知有待接之连;`接受` 得连接之柄。 **客户端。** `连接开始` 立返一非阻塞之连接柄(域名解析或于其间阻塞,首版容之);以 `等待`(可写)候其连成;`连接完成` 取其果:状态之码零,谓已连;否则为败之因(14 连被拒、73 超时、……)。 **收发。** 连接之柄用 `读`、`写`:读得零,谓对端有序而闭;对端重置则返 15;书于已闭之连接则返 64。`关闭写` 唯闭写之向,对端读至文件尾,本端仍可读。`关闭` 释其柄。 新所接之连接柄,默认阻塞;须非阻塞者,以 `设非阻塞` 置之。 ## 函数(`网络。接口。豫`) | 函数 | 参 | 用 | | --- | --- | --- | | 监听 | 主机址, 主机长, 端口, 队列长, 出 | 于(主机,端口)监听;主机为空串谓任意之址;监听之柄四字节书于出址;址已用则返 3 | | 连接开始 | 主机址, 主机长, 端口, 出 | 始连,非阻塞;主机可为名或数字之址;柄四字节书于出址 | | 连接完成 | 句柄 | 取连接之果,状态之码即其果;连尚未成则返 6 | | 接受 | 监听句柄, 出 | 新连接之柄四字节书于出址;非阻塞而无待接之连则返 6 | | 关闭写 | 句柄 | 半闭 | | 取本地端口 | 句柄, 出 | 本地端口,四字节(监听而端口为零者,以此取其实端口) | | 设无延迟 | 句柄, 开关 | 开关 1 置无延迟(闭 Nagle),0 除之 | ## 平台之注 - 桌面:BSD 套接字(Linux、macOS)与 ws2_32(Windows);IPv4 与 IPv6,平台裁之;`监听` 之主机串为空,则监听双栈或任意之址。 - 与标准库今有之传输控制协议原语(十四,`豫言_传输控制协议_*`),皆可由本包加底层句柄行之:监听、开始连接、完成连接、接受、读取、写入、等待、获取本地端口、设置无延迟、关闭写入、关闭。