异步 DNS 解析,具备您所需的所有 DNS 功能!
加入我们的 Discord,提出任何问题和进行友好交流。
添加软件包
.package(url: "https://github.com/orlandos-nl/DNSClient.git", from: "2.0.0"),
并添加到您的目标
.product(name: "DNSClient", package: "DNSClient"),
使用 UDP 连接到您的默认 DNS 服务器
let client = try DNSClient.connect(on: loop).wait()
连接到特定的 DNS 服务器
let googleDNS = SocketAddress(ipAddress: "8.8.8.8", port: 53)
let client = try DNSClient.connect(on: loop, config: [googleDNS]).wait()
解析 SRV 记录
let records = try client.sendQuery(forHost: "example.com", type: .srv).wait()
解析 TXT 记录
let records = try client.sendQuery(forHost: "example.com", type: .txt).wait()
解析 PTR 记录
let records = try client.ipv4InverseAddress("198.51.100.1").wait()
let records = try client.ipv6InverseAddress("2001:DB8::").wait()
还需要我多说吗?
注意:您可以将 .wait()
函数调用替换为 .get()
,以使用 async/await 获取结果。
在 iOS 12+ 上,您可以使用 Network.Framework 进行连接
import NIOTransportServices
import DNSClient
let client = try DNSClient.connect(on: loop, host: "1.1.1.1").wait()
还有另一个重载实现了 TCP 支持
let client = try DNSClient.connectTSTCP(on: loop, host: "1.1.1.1").wait()
TCP 支持在 Linux 上也可用,形式为 DNSClient.connectTCP(on: loop, host: ...)
请注意,NIOTS (TransportServices) 需要它们自己的 EventLoop 类型,而 NIO 的 MultiThreadedEventLoopGroup
用于 POSIX/Linux 实现。
DNS 客户端在请求期间不会保留自身。这意味着您不能执行以下操作
DNSClient.connect(on: request.eventLoop).flatMap { client in
// client.doQueryStuff()
}
客户端将自行释放,导致超时。请确保 client
被强引用,直到所有结果都返回,或者通过将其设置在共享上下文中。在 Vapor 中,这可以是请求的 storage
容器。在其他服务中,您可以考虑全局变量、ThreadSpecificVariable 或类上的属性。