A simple Multicast Domain Name Service based on RFC 6762. Can be used as both a client (sending queries) or a server (responding to queries).
A higher level DNS Service Discovery based on RFC 6763 that automatically responds to any query for the service or service instance.
DNS data model with serializer/deserializer for the wire and "master file" format.
This repository is a fork of Richard Schneider's net-mdns and net-dns repository without any additional dependencies.
- Targets Framework 4.6, .NET Standard 2.0 and .NET 5
- Supports IPv6 and IPv4 platforms
- Detects new and/or removed network interfaces
- Supports multicasting on multiple network interfaces
- Supports reverse address mapping
- Supports service subtypes (features)
- Handles legacy unicast queries, see #61
- Serialization for the wire and master file formats
- Pretty printing of messages
- Supports compressed domain names
- Supports multiple strings in TXT records
- Supports the extended 12-bit RCODE
- Future proof: handles unknown resource records and EDNS options
- Graceful truncation of messages
- A name server that answeres DNS questions
- Data models for
- RFC 1035 Domain Names (DNS)
- RFC 1183 New DNS RR Definitions
- RFC 1996 Zone Changes (DNS NOTIFY)
- RFC 2136 Dynamic Updates (DNS UPDATE)
- RFC 2845 Secret Key Transaction Authentication for DNS (TSIG)
- RFC 2930 Secret Key Establishment for DNS (TKEY RR)
- RFC 3225 Indicating Resolver Support of DNSSEC
- RFC 3599 DNS Extensions to Support IPv6
- RFC 4034 Resource Records for the DNS Security Extensions (DNSSEC)
- RFC 5001 DNS Name Server Identifier (NSID) Option
- RFC 6672 DNAME Redirection in the DNS
- RFC 6891 Extension Mechanisms for DNS (EDNS(0))
- RFC 7828 The edns-tcp-keepalive EDNS0 Option
- RFC 7830 The EDNS(0) Padding Option
- RFC 8914 Extended DNS Errors
Published releases are available on NuGet. To install, run the following command in the Package Manager Console
PM> Install-Package MeaMod.DNS
or using .NET CLI run the following command in the project folder
> dotnet add package MeaMod.DNS
Always broadcast the service ("foo") running on local host with port 1024.
using MeaMod.DNS.Multicast;
var service = new ServiceProfile("x", "_foo._tcp", 1024);
var sd = new ServiceDiscovery();
sd.Advertise(service);
See the example advertiser for a working program.
Find all services running on the local link.
using MeaMod.DNS.Multicast;
var sd = new ServiceDiscovery();
sd.ServiceDiscovered += (s, serviceName) => { // Do something };
Find all service instances running on the local link.
using MeaMod.DNS.Multicast;
var sd = new ServiceDiscovery();
sd.ServiceInstanceDiscovered += (s, e) => { // Do something };
See the example browser for a working program.
Get all the Apple TVs. The query is sent when a network interface is discovered.
The AnsweredReceived
callback contains any answer that is seen, not just the answer
to the specific query.
using MeaMod.DNS.Multicast;
var mdns = new MulticastService();
mdns.NetworkInterfaceDiscovered += (s, e) => mdns.SendQuery("appletv.local");
mdns.AnswerReceived += (s, e) => { // do something with e.Message };
mdns.Start();
Get the first answer to Apple TVs. Wait 2 seconds for an answer.
using MeaMod.DNS;
using MeaMod.DNS.Multicast;
var service = "appletv.local";
var query = new Message();
query.Questions.Add(new Question { Name = service, Type = DnsType.ANY });
var cancellation = new CancellationTokenSource(2000);
using (var mdns = new MulticastService())
{
mdns.Start();
var response = await mdns.ResolveAsync(query, cancellation.Token);
// Do something
}
Respond to a query for the service. Note that ServiceDiscovery.Advertise
is much easier.
using MeaMod.DNS;
using MeaMod.DNS.Multicast;
var service = "...";
var mdns = new MulticastService();
mdns.QueryReceived += (s, e) =>
{
var msg = e.Message;
if (msg.Questions.Any(q => q.Name == service))
{
var res = msg.CreateResponse();
var addresses = MulticastService.GetIPAddresses()
.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork);
foreach (var address in addresses)
{
res.Answers.Add(new ARecord
{
Name = service,
Address = address
});
}
mdns.SendAnswer(res);
}
};
mdns.Start();
Create a name server that can answer questions for a zone.
using MeaMod.DNS;
using MeaMod.DNS.Server;
var catalog = new Catalog();
catalog.IncludeZone(...);
catalog.IncludeRootHints();
var resolver = new NameServer { Catalog = catalog };
Answer a question
var request = new Message();
request.Questions.Add(new Question { Name = "ns.example.com", Type = DnsType.AAAA });
var response = await resolver.ResolveAsync(request);
using MeaMod.DNS;
var msg = new Message
{
AA = true,
QR = true,
Id = 1234
};
msg.Questions.Add(new Question
{
Name = "emanon.org"
});
msg.Answers.Add(new ARecord
{
Name = "emanon.org",
Address = IPAddress.Parse("127.0.0.1")
});
msg.AuthorityRecords.Add(new SOARecord
{
Name = "emanon.org",
PrimaryName = "erehwon",
Mailbox = "hostmaster.emanon.org"
});
msg.AdditionalRecords.Add(new ARecord
{
Name = "erehwon",
Address = IPAddress.Parse("127.0.0.1")
});
- net-dns - DNS data model and Name Server with serializer for the wire and master file format
- net-udns - client for unicast DNS, DNS over HTTPS (DOH) and DNS over TLS (DOT)
- net-mdns - client and server for multicast DNS
Copyright © 2021 James Weston
Copyright © 2018-2019 Richard Schneider ([email protected])
The package is licensed under the MIT license. Refer to the LICENSE file for more information.