Skip to content

PassiveLogic/NioDNS

This branch is 9 commits behind orlandos-nl/DNSClient:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

9c7cc44 Β· Sep 2, 2023
Aug 26, 2023
Aug 30, 2023
Aug 30, 2023
Jul 7, 2019
Oct 11, 2018
Feb 9, 2021
Feb 9, 2021
Aug 10, 2023
Aug 10, 2023
Sep 2, 2023

Repository files navigation

NioDNS

Async DNS resolution, with all the DNS features you need!

Join our Discord for any questions and friendly banter.

Installation πŸ’₯

Add the package:

.package(url: "https://github.com/orlandos-nl/DNSClient.git", from: "2.0.0"),

And to your target:

.product(name: "DNSClient", package: "DNSClient"),

Usage 🀯

Connect to your default DNS Server using UDP:

let client = try DNSClient.connect(on: loop).wait()

Connect to a specific DNS Server:

let googleDNS = SocketAddress(ipAddress: "8.8.8.8", port: 53)
let client = try DNSClient.connect(on: loop, config: [googleDNS]).wait()

Resolve SRV Records:

let records = try client.sendQuery(forHost: "example.com", type: .srv).wait()

Resolve TXT Records:

let records = try client.sendQuery(forHost: "example.com", type: .txt).wait()

Resolve PTR Records:

let records = try client.ipv4InverseAddress("198.51.100.1").wait()

let records = try client.ipv6InverseAddress("2001:DB8::").wait()

Need I say more?

Note: You can replace .wait() function calls with .get() to get the result using async/await.

iOS and TCP Support

On iOS 12+, you can connect using Network.Framework:

import NIOTransportServices
import DNSClient

let client = try DNSClient.connect(on: loop, host: "1.1.1.1").wait()

There is also another overload that implements TCP support:

let client = try DNSClient.connectTSTCP(on: loop, host: "1.1.1.1").wait()

TCP support is also available on Linux as DNSClient.connectTCP(on: loop, host: ...)

Note that NIOTS (TransportServices) needs their own EventLoop type, whereas NIO's MultiThreadedEventLoopGroup is used for the POSIX/Linux implementation.

Notes

The DNS Client doesn't retain itself during requests. This means that you cannot do the following:

DNSClient.connect(on: request.eventLoop).flatMap { client in
    // client.doQueryStuff()
}

The client will deallocate itself, resulting in a timeout. Make sure that the client is strongly referenced, either until all results are in or by setting it on a shared context. In Vapor, that can be the request's storage container. On other services, you could consider a global, ThreadSpecificVariable or a property on your class.

Featured In πŸ›

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Swift 95.0%
  • Ruby 4.7%
  • CMake 0.3%