NioDNS

异步 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 和 TCP 支持

在 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 或类上的属性。

特色应用 🛍