人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载SocketAddress 是仓颉标准库std.net包中表示协议无关 Socket 地址的抽象基类它为 TCP、UDP、Unix Domain Socket 等所有地址类型提供了统一的类型门面。阅读本篇后你将掌握SocketAddress的类声明与全部成员接口size、family、getAddressBytes、/!理解它与IPSocketAddress、UnixSocketAddress两个实现子类之间的继承关系并能结合std.net的真实示例在 Socket 的绑定、连接与报文收发场景中正确使用地址对象。SocketAddress 在 std.net 中的定位在仓颉std.net包中Socket 地址被设计为统一的抽象层。从 net 包功能总览 可以看到std.net提供 IP 地址、IP 前缀、Socket 地址等数据结构以及 TCP / UDP / UDS 三类 Socket 的完整通信能力。其中地址类家族包括类职责IPAddress表示 IPv4 / IPv6 IP 地址IPPrefix表示 IP 前缀IP 子网IPSocketAddressIP 地址 端口号实现SocketAddressUnixSocketAddressUnix Domain Socket 文件系统路径实现SocketAddressSocketAddress协议无关的 Socket 地址抽象基类SocketAddress位于这一地址体系的最顶端。它本身是一个抽象密封类源码声明如下见 net_package_classes.mdabstract sealed class SocketAddress : ToString EquatableSocketAddress Hashable从声明可以看出三个关键设计点abstract不能直接实例化只能通过其子类IPSocketAddress、UnixSocketAddress创建对象sealed只能在std.net包内被继承外部模块无法新增其他 Socket 地址类型这保证了地址类型体系的封闭与安全父类型实现了 ToString文本表示、EquatableSocketAddress相等比较与 Hashable哈希三个核心接口。按照文档定义SocketAddress提供了一个不可变对象用于 Socket 的绑定bind、连接connect或作为返回值。std.net的各类 Socket 接口正是以它为参数与返回类型例如 DatagramSocket 的sendTo(address: SocketAddress, payload)、receiveFrom(buffer)返回(SocketAddress, Int64)ServerSocket 与各 Socket 的localAddress/remoteAddress属性类型均为SocketAddress。成员函数与属性详解SocketAddress提供三个成员接口均面向底层原始数据访问是编写协议处理、地址序列化与调试输出时的高频 API原型出自 SocketAddress_class.md名称原型说明size(): Int64当前 SocketAddress 对象的原始字节长度family(): AddressFamily当前 SocketAddress 对象的地址族getAddressBytes(): ArrayByte返回此 SocketAddress 对象的原始 IP 地址size原始字节长度size返回当前地址对象在内存中的原始字节长度。不同地址类型长度不同从子类实现可以推断其取值IPv4地址族地址固定为 4 字节对应sockaddr_in结构IPv6地址族地址为 16 字节对应sockaddr_in6Unix Domain Socket 地址则取决于路径长度。该属性常用于与底层系统调用交互或分配接收缓冲区。family地址族标识family返回地址族类型为结构体 AddressFamily。AddressFamily用于标识 Socket 的寻址方案常用常量如下值定义见 net_package_structs.md常量名称值含义UNSPECUNSPEC0未指定地址族UNIXUNIX1Unix Domain Socket 地址族INETINET2IPv4 地址族INET6INET610Linux/ 23Windows/ 30macOSIPv6 地址族NETLINKNETLINK16NetLink 地址族仅 Linux 支持对子类而言family属性通常与对象所携带的地址类型一一对应IPSocketAddress根据内部 IP 地址返回INET或INET6而UnixSocketAddress的family恒为AddressFamily.UNIX。调用者可以通过比较family判断地址的协议族再进行类型安全的向下转换。getAddressBytes原始字节表示getAddressBytes返回地址对象的原始字节数组是地址二进制序列化的入口。子类实现遵循对应的 C 语言sockaddr系列结构布局IPSocketAddress.getAddressBytes()返回的内容布局与sockaddr_in或sockaddr_in6一致见 IPSocketAddress 文档UnixSocketAddress.getAddressBytes()返回的内容布局与sockaddr_un一致见 UnixSocketAddress 文档。例如在 UnixSocketAddress 的官方示例中路径为/tmp/server1.sock的地址对象其原始字节可表示为\u{1}\u{0}/tmp/server1.sock.toArray()即首字节为地址族、随后为路径内容。这一能力让地址对象可以与系统底层接口或跨语言协议栈直接交换数据。运算符重载 与 !除了三个成员接口SocketAddress还重载了两个运算符见 SocketAddress_class.json名称原型说明(rhs: SocketAddress): Bool判断两个 SocketAddress 对象是否相等!(rhs: SocketAddress): Bool判断两个 SocketAddress 对象是否不等配合父类型中的Equatable与Hashable地址对象可以直接放入哈希容器如HashSet、HashMap中作为 key并支持值语义的比较。子类同样重载了对应的运算符例如UnixSocketAddress的官方示例中通过Assert(udsa1_1, udsa2_1)验证了使用字符串与字节数组构造的同一路径地址是相等的见 UnixSocketAddress_class.md。两个实现子类IPSocketAddress 与 UnixSocketAddressSocketAddress的抽象能力由两个公开子类具体承载。IPSocketAddressIP 地址 端口IPSocketAddress 是 TCP / UDP 编程中使用最频繁的地址类型封装IP 地址 端口号支持三种构造方式public class IPSocketAddress : SocketAddress EquatableIPSocketAddress{ public init(address: ArrayByte, port: UInt16) // 大端序字节数组 IP 本机序端口 public init(address: String, port: UInt16) // 字符串 IP 本机序端口 public init(address: IPAddress, port: UInt16) // IPAddress 对象 本机序端口 }其中address: ArrayByte形式要求传入大端序IP 字节address: String形式若 IP 字符串不合法会抛出 IllegalFormatException字节数组形式不合法则抛出IllegalArgumentException。它同时提供了便捷的文本解析接口static func parse(s: String): IPSocketAddress—— 解析形如192.168.1.2:8080IPv4或[2001:0250:1006:dff0:4913:2aa5:8075:7c10]:8080IPv6注意方括号包裹的 Socket 字符串非法输入抛IllegalFormatExceptionstatic func tryParse(s: String): ?IPSocketAddress—— 解析失败返回None适合不中断流程的健壮场景。官方示例验证了往返一致性import std.net.* import std.unittest.* import std.unittest.testmacro.* main () { let v4: IPSocketAddress IPSocketAddress.parse(192.168.1.2:8080) let v6: IPSocketAddress IPSocketAddress.parse([2001:0250:1006:dff0:4913:2aa5:8075:7c10]:8080) Assert(v4.address.toString(), 192.168.1.2) Assert(v4.port, 8080u16) Assert(v4.toString(), 192.168.1.2:8080) Assert(v6.toString(), [2001:250:1006:dff0:4913:2aa5:8075:7c10]:8080) }此外它还提供isIPv4()/isIPv6()用于快速判断地址类型toString()按规范输出文本表示hashCode()供哈希容器使用。UnixSocketAddressUnix Domain Socket 路径UnixSocketAddress 封装了 Unix Domain Socket 绑定或连接到的文件系统路径同样实现了SocketAddresspublic class UnixSocketAddress : SocketAddress EquatableUnixSocketAddress { public init(path: ArrayByte) public init(path: String) }构造约束不合法输入抛IllegalArgumentException路径长度不可超过 108 字节路径为空字符串表示unnamed未命名地址路径以\0开头表示abstract抽象命名空间地址路径中间不可包含\0。其family属性恒为AddressFamily.UNIXtoString()返回路径字符串如/tmp/server1.sockabstract 地址则带\0前缀。官方示例对字符串构造、字节数组构造、\0尾随填充的等价性以及非法路径的异常行为都做了完整断言可在 UnixSocketAddress_class.md 中查看。实战SocketAddress 在 TCP / UDP / UDS 中的使用SocketAddress的最终价值体现在真实网络编程中。std.net提供了经过验证的可运行示例位于 net_samples下面结合三种典型场景说明地址对象如何参与 Socket 的绑定、连接与收发。TCP以 SocketAddress 完成绑定与连接在 TCP 示例 中服务端直接用端口号构造TcpServerSocket并bind()客户端则使用TcpSocket(127.0.0.1, SERVER_PORT)发起连接import std.net.* import std.sync.* let SERVER_PORT: UInt16 33333 let syncCounter SyncCounter(1) func runTcpServer() { try (serverSocket TcpServerSocket(bindAt: SERVER_PORT)) { serverSocket.bind() syncCounter.dec() try (client serverSocket.accept()) { let buf ArrayByte(10, repeat: 0) let count client.read(buf) println(Server read ${count} bytes: ${buf}) } } } main(): Int64 { let fut spawn { runTcpServer() } syncCounter.waitUntilZero() try (socket TcpSocket(127.0.0.1, SERVER_PORT)) { socket.connect() socket.write([1, 2, 3]) } fut.get() return 0 }这里TcpServerSocket/TcpSocket的构造参数内部即会转换成IPSocketAddress对象而accept()返回的StreamingSocket、以及各 Socket 的localAddress/remoteAddress属性其类型正是SocketAddress——当需要打印远端地址或获取其原始字节时可以直接以SocketAddress引用调用size/family/getAddressBytes()。UDPreceiveFrom 返回 SocketAddress在 UDP 示例 中receiveFrom直接返回报文来源的SocketAddress展示了地址作为返回值的典型用法import std.net.* import std.sync.* let SERVER_PORT: UInt16 33333 let barrier Barrier(2) func runUdpServer() { try (serverSocket UdpSocket(bindAt: SERVER_PORT)) { serverSocket.bind() barrier.wait() let buf ArrayByte(3, repeat: 0) let (clientAddr, count) serverSocket.receiveFrom(buf) // 将 SocketAddress 向下转型为 IPSocketAddress取出 IP 文本 let sender (clientAddr as IPSocketAddress)?.address.toString() ?? println(Server receive ${count} bytes: ${buf} from ${sender}) } } main(): Int64 { let fut spawn { runUdpServer() } barrier.wait() try (udpSocket UdpSocket(bindAt: 0)) { // random port udpSocket.sendTimeout Duration.second * 2 udpSocket.bind() udpSocket.sendTo(IPSocketAddress(127.0.0.1, SERVER_PORT), [1, 2, 3]) } fut.get() return 0 }这段代码展示了两个关键点发送sendTo(address: SocketAddress, payload)要求显式构造IPSocketAddress(127.0.0.1, SERVER_PORT)作为目标地址接收receiveFrom返回的(SocketAddress, Int64)元组中clientAddr是SocketAddress类型的引用需要借助as IPSocketAddress向下转型后才能读取address、port等子类专有属性。运行结果Server receive 3 bytes: [1, 2, 3] from 127.0.0.1验证了该流程。Unix Domain Socket路径即地址在 UNIX 示例 中地址以文件系统路径的形式出现import std.net.* import std.sync.* import std.fs.* let SOCKET_PATH /tmp/tmpsock let barrier Barrier(2) func runUnixServer() { remove(SOCKET_PATH) try (serverSocket UnixServerSocket(bindAt: SOCKET_PATH)) { serverSocket.bind() barrier.wait() try (client serverSocket.accept()) { client.write(hello.toArray()) } } } main(): Int64 { let fut spawn { runUnixServer() } barrier.wait() try (socket UnixSocket(SOCKET_PATH)) { socket.connect() let buf ArrayByte(10, repeat: 0) socket.read(buf) println(String.fromUtf8(buf)) // hello } fut.get() return 0 }服务端与客户端分别通过UnixServerSocket(bindAt: SOCKET_PATH)和UnixSocket(SOCKET_PATH)绑定到/tmp/tmpsockaccept()返回的流式 Socket 同样以SocketAddress暴露其本地 / 远端地址。UnixDatagramSocket场景见 unix_datagram.md还演示了以clientAddr.toString()校验数据报来源路径的做法其返回类型同样是SocketAddress。小结SocketAddress是仓颉std.net地址体系的核心抽象它通过abstract sealed声明封闭了地址类型的继承边界通过ToString/Equatable/Hashable赋予了地址对象完整的文本化、比较与哈希能力size、family、getAddressBytes()三个成员接口则向下兼容了系统层sockaddr结构的原始数据需求。在实际开发中只需面向SocketAddress编写通用逻辑再通过IPSocketAddress与UnixSocketAddress分别处理 IP 网络与进程间通信即可覆盖 TCP、UDP、UDS 三类主流通信场景。相关源码、完整 API 与可运行示例可在 std/net 目录中继续查阅。赞分享人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载相关推荐仓颉 std.net 网络编程类库全解析IP 地址、Socket 地址与 TCP/UDP/UDS 套接字实战指南仓颉 std.net 网络编程类库全解析IP 地址、Socket 地址与 TCP/UDP/UDS 套接字实战指南 导读 本文以仓颉编程语言标准库 std.ne文档知识库教程OpenHarmony仓颉 std.net 网络包 IPSocketAddress 详解IP Socket 地址建模、字符串解析与 Socket 实战仓颉 std.net 网络包 IPSocketAddress 详解IP Socket 地址建模、字符串解析与 Socket 实战 本篇指南以 DocAgent人工智能AI 技能文档开发工具仓颉 std.net 网络编程指南IP 地址、前缀与 TCP/UDP/Unix Socket 类库全解仓颉 std.net 网络编程指南IP 地址、前缀与 TCP/UDP/Unix Socket 类库全解 导读 本文以仓颉编程语言标准库 std.net 源码编程语言语言运行时标准库垃圾回收并发编程上一篇网页视频怎么存到本地硬盘猫抓cat-catch资源嗅探扩展完整指南下一篇免费搞定 Mac 读写 NTFS 硬盘:Free-NTFS-for-Mac 完整上手指南(3 分钟跑起来)创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考