MeaMod.DNS
Simple multicast DNS and DNS data model and Name Server with serializer for the wire and master file format
Install / Use
/learn @meamod/MeaMod.DNSREADME
MeaMod.DNS
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.
Credits and Disclaimer
This repository is a fork of Richard Schneider's net-mdns and net-dns repository without any additional dependencies.
Features
- Targets Framework 4.6, .NET Standard 2.0 and .NET 5
MeaMod.DNS.Multicast Features
- 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
MeaMod.DNS Features
- 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
Getting started
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
Usage Service Discovery
Advertising
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.
Discovery
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.
Usage Multicast
Event Based Queries
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();
Async Queries
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
}
Broadcasting
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();
Name Server
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);
Data Model
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")
});
Related projects
- 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
License
Copyright © 2021 James Weston
Copyright © 2018-2019 Richard Schneider (makaretu@gmail.com)
The package is licensed under the MIT license. Refer to the LICENSE file for more information.
Related Skills
node-connect
349.7kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
349.7kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
349.7kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
