套接字
使用带权限、超时、EOF、读取上限和稳定错误代码的 TCP/UDP 文字与二进制套接字。
言序 1.1.4 在原生平台提供加固的标准:套接字。它面向需要自定义应用协议的程序;普通 HTTP/HTTPS 请求仍应优先使用更高层的标准:网络。
套接字是不可伪造、不可序列化的宿主资源值,运行时类型为套接字。多个变量可以引用同一资源;关闭是幂等操作,最后一个引用释放时宿主也会自动关闭资源。WASI 不隐式提供原生套接字,入口会返回SOCKET_UNSUPPORTED。
TCP 客户端
引「标准:套接字」为 套接字;
定 流:套接字 为 套接字.TCP连接(「127.0.0.1:8080」,5000);
试 则
套接字.发送(流,「问安\n」,5000);
定 回应:文 为 套接字.接收(流,65536,5000);
言 回应;
救 所误 则
言 所误.代码;
言 所误.消息;
终
套接字.关闭(流);TCP连接(地址,超时毫秒)从调用开始计时,DNS 解析和多个候选地址共用同一截止时间。发送保证所给 UTF-8 正文完整写入或失败。接收会在内部保留未完成的 UTF-8 字节并继续读取,直到形成完整文字、超时或超限;空文字表示 EOF,不表示“暂时没有数据”。
TCP 是没有消息边界的字节流。一次发送可能被多次接收,一次接收也可能包含多条应用消息;调用方必须使用长度前缀、分隔符或关闭定界来设计协议。
TCP 二进制与 EOF
发送字节保证整个字节串写完或失败。接收字节返回{数据:字节串,已结束:理}:只有底层读到 0 时已结束才为真;普通短读不等于 EOF。精确读取(流,字节数,超时)只在读满时成功,提前结束返回SOCKET_EOF。关闭写端发送 TCP FIN 但保留读取能力;TCP无延迟(流,理)显式控制 Nagle 策略。
引「标准:套接字」为 套接字;
引「标准:字节」为 字节;
套接字.TCP无延迟(流,真);
套接字.发送字节(流,字节.从数列(【0,255,1】),5000);
套接字.关闭写端(流);
定 所得:典<文,任意> 为 套接字.接收字节(流,65536,5000);
若 所得【「已结束」】 则 言「对端已结束」;终TCP 服务端
引「标准:套接字」为 套接字;
定 监听器:套接字 为 套接字.TCP监听(「127.0.0.1:9000」);
定 来客:典<文,任意> 为 套接字.接受(监听器,30000);
定 流:套接字 为 来客【「套接字」】;
言 来客【「对端」】;
套接字.发送(流,「安好」,5000);
套接字.关闭(流);
套接字.关闭(监听器);TCP监听允许使用端口 0,由操作系统选择空闲端口;用本地地址读取实际地址。接受返回含套接字与对端的典,并且必须给出等待超时。沙箱不会因已有network权限而获得监听能力,公网监听必须在TCP监听权限中显式声明目标地址。
UDP 数据报
引「标准:套接字」为 套接字;
定 数据报:套接字 为 套接字.UDP绑定(「127.0.0.1:0」);
套接字.UDP发送至(数据报,「善哉」,「127.0.0.1:9000」,5000);
定 所得:典<文,文> 为 套接字.UDP接收自(数据报,65536,5000);
言 所得【「正文」】;
言 所得【「对端」】;
套接字.关闭(数据报);UDP 保留数据报边界。若数据报超过调用方的最大字节,运行时返回SOCKET_LIMIT,不得把截断内容伪装为成功。
二进制数据报使用UDP发送字节至与UDP接收字节自;后者返回数据字节串和对端地址,不执行 UTF-8 解码。
预算、编码与权限
- 超时必须是 1..=86,400,000 的整数毫秒;连接、接受、发送和接收都没有无界阻塞入口。
- 单次接收上限必须是 1..=4,194,304 字节。上限按 UTF-8 字节计算,不按字符数计算。
- 文字入口严格使用 UTF-8;二进制入口原样保留 NUL、0xFF、图片、字体和压缩内容。
- 外连与 UDP 发送使用
network,TCP 监听使用tcp_listen,UDP 绑定使用udp_bind;默认嵌入沙箱三项均未授权。 - 每次 DNS 解析后会再检查真实 IP。回环、私网、链路本地与其他特殊 IP 须按 IP 精确列入
network,通配符*不覆盖这些地址。 - 每个运行时默认最多同时开放 128 个套接字资源和 16 个 TCP 监听器;超限返回
SOCKET_LIMIT。 - 地址使用
主机:端口或[IPv6]:端口;本地地址返回操作系统实际绑定地址,对端地址只对 TCP 流返回文字,监听器与 UDP 返回空。
完整SOCKET_*代码表见错误处理。程序应判断.代码,不应解析可能改进的.消息。