[![Build Status](](

DNS library for Elixir. Currently, the package provides:

- Elixir structs to interface with `inet_dns` module.
- DNS.Server behavior
- DNS client

Note: the `inet_dns` module is considered internal to Erlang and subject to
change. If this happened this library will be updated to accommodate for that,
but for now `inet_dns` is simple and worked for me.

## Installation

The package is available in [Hex]( and can be installed as:

  1. Make sure you have the Erlang/OTP source files installed,
     otherwise the compilation will fail with an `{:error, :enoent}`
     message. On Ubuntu, this can be done using `apt-get install

  2. Add dns to your list of dependencies in `mix.exs`:

        def deps do
          [{:dns, "~> 2.1.1"}]

  3. Ensure dns is started before your application:

        def application do
          [applications: [:dns]]

## Usage

### DNS client

iex> DNS.resolve("")
{:ok, [{216, 58, 221, 110}]}

iex> DNS.resolve("notfound.domain")
{:error, :not_found}

iex> DNS.query("")
%DNS.Record{anlist: [%DNS.Resource{bm: [], class: :in, cnt: 0,
   data: {216, 58, 221, 110}, domain: '', func: false, tm: :undefined,
   ttl: 129, type: :a}], arlist: [],
 header: %DNS.Header{aa: false, id: 0, opcode: :query, pr: false, qr: true,
  ra: true, rcode: 0, rd: false, tc: false}, nslist: [],
 qdlist: [%DNS.Query{class: :in, domain: '', type: :a}]}

iex> DNS.resolve("", :a, {"", 53})

### DNS server

defmodule ServerExample do
  @moduledoc """
  Example implementing DNS.Server behaviour
  @behaviour DNS.Server
  use DNS.Server

  def handle(record, _cl) do -> "#{inspect(record)}" end)
    query = hd(record.qdlist)

    result =
      case query.type do
        :a -> {127, 0, 0, 1}
        :cname -> ''
        :txt -> ['your txt value']
        _ -> nil

    resource = %DNS.Resource{
      domain: query.domain,
      class: query.class,
      type: query.type,
      ttl: 0,
      data: result

    %{record | anlist: [resource]}
# To create a server
{:ok, server_pid} = ServerExample.start_link 8000

For more information, see [API Reference](

## License