Simple multicast 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.
Published releases are available on NuGet. To install, run the following command in the Package Manager Console
PM> Install-Package Makaretu.Dns.Multicast
or using .NET CLI run the following command in the project folder
> dotnet add package Makaretu.Dns.Multicast
Always broadcast the service ("foo") running on local host with port 1024.
using Makaretu.Dns;
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 Makaretu.Dns;
var sd = new ServiceDiscovery();
sd.ServiceDiscovered += (s, serviceName) => { // Do something };
Find all service instances running on the local link.
using Makaretu.Dns;
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 Makaretu.Dns;
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 Makaretu.Dns;
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 Makaretu.Dns;
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();
Copyright © 2018-2019 Richard Schneider ([email protected])
The package is licensed under the MIT license. Refer to the LICENSE file for more information.