private void Discover() { ServiceDiscovery sd = new ServiceDiscovery(mdns); mdns.NetworkInterfaceDiscovered += (s, e) => { foreach (var networkInterface in e.NetworkInterfaces) { logger.Info($"Network-Interface: '{networkInterface.Name}' found"); } }; sd.ServiceDiscovered += Sd_ServiceDiscovered; sd.ServiceInstanceDiscovered += Sd_ServiceInstanceDiscovered; sd.ServiceInstanceShutdown += Sd_ServiceInstanceShutdown; try { mdns.Start(); cancellationToken = new CancellationTokenSource(); while (!cancellationToken.IsCancellationRequested) { sd.QueryAllServices(); Thread.Sleep(DISCOVER_THREAD_DELAY); } } finally { sd.Dispose(); mdns.Stop(); } }
public Task <bool> Start() { _multicastService = new MulticastService(); _serviceDiscovery = new ServiceDiscovery(); _multicastService.NetworkInterfaceDiscovered += (sender, args) => { _serviceDiscovery.QueryAllServices(); }; _serviceDiscovery.ServiceDiscovered += (s, serviceName) => { _logger.LogInformation($"service '{serviceName}'"); // Ask for the name of instances of the service. _multicastService.SendQuery(serviceName, type: DnsType.PTR); }; _serviceDiscovery.ServiceInstanceDiscovered += (s, e) => { _logger.LogInformation($"service instance '{e.ServiceInstanceName}'"); // Ask for the service instance details. _multicastService.SendQuery(e.ServiceInstanceName, type: DnsType.SRV); }; _multicastService.Start(); return(Task.FromResult(true)); }
public static void Main(string[] args) { var mdns = new MulticastService(); var sd = new ServiceDiscovery(mdns); mdns.NetworkInterfaceDiscovered += (s, e) => { foreach (var nic in e.NetworkInterfaces) { Console.WriteLine($"NIC '{nic.Name}'"); } // Ask for the name of all services. sd.QueryAllServices(); }; sd.ServiceDiscovered += (s, serviceName) => { Console.WriteLine($"service '{serviceName}'"); // Ask for the name of instances of the service. mdns.SendQuery(serviceName, type: DnsType.PTR); }; mdns.AnswerReceived += (s, e) => { // Is this an answer to a instances query? var pointers = e.Message.Answers.OfType <PTRRecord>().Where(p => p.Name != ServiceDiscovery.ServiceName); foreach (var pointer in pointers) { Console.WriteLine($"service instance '{pointer.DomainName}'"); // Ask for the service instance details. mdns.SendQuery(pointer.DomainName, type: DnsType.SRV); } // Is this an answer to a service instance details? var servers = e.Message.Answers.OfType <SRVRecord>(); foreach (var server in servers) { Console.WriteLine($"host '{server.Target}' for '{server.Name}'"); // Ask for the host IP addresses. mdns.SendQuery(server.Target, type: DnsType.A); mdns.SendQuery(server.Target, type: DnsType.AAAA); } // Is this an answer to host addresses? var addresses = e.Message.Answers.OfType <AddressRecord>(); foreach (var address in addresses) { Console.WriteLine($"host '{address.Name}' at {address.Address}"); } }; try { mdns.Start(); Console.ReadKey(); } finally { sd.Dispose(); mdns.Stop(); } }
public virtual void Init() { if (_disposedValue) { throw new ObjectDisposedException("ServiceDirectory"); } _mdns.NetworkInterfaceDiscovered += (s, e) => { // Ask for the name of all services. _sd.QueryAllServices(); }; _sd.ServiceDiscovered += (s, serviceName) => { // Check if this is a service we're interested in bool interesting = true; if (FilterFunction != null) { interesting = FilterFunction(serviceName.ToString()); } if (!interesting) { return; } // Ask for the name of instances of the service. _mdns.SendQuery(serviceName, type: DnsType.PTR); }; _sd.ServiceInstanceDiscovered += (s, e) => { // Ask for the service instance details. _mdns.SendQuery(e.ServiceInstanceName, type: DnsType.SRV); }; _sd.ServiceInstanceShutdown += (s, e) => { Debug.WriteLine("Removing service instance {0} from MDNS message", e.ServiceInstanceName); RemoveServiceByName(e.ServiceInstanceName.ToString()); }; _mdns.AnswerReceived += (s, e) => { // Is this an answer to a service instance details? var servers = e.Message.Answers.OfType <SRVRecord>(); foreach (var server in servers) { // For some reason, some services slip through the cracks of the first filter at ServiceDiscovered // and we have to filter again. bool interesting = true; if (FilterFunction != null) { interesting = FilterFunction(server.Name.ToString()); } if (!interesting) { continue; } var newSvc = new ServiceEntry { Host = server.Target.ToString(), Port = server.Port, Service = server.Name.ToString() }; AddService(newSvc); // Query IP addresses (only IPv4) _mdns.SendQuery(server.Target, type: DnsType.A); } // Is this an answer to host addresses? var addresses = e.Message.Answers.OfType <AddressRecord>(); foreach (var address in addresses) { // Find corresponding host lock (_entries) { var host = from entry in _entries where entry.Host == address.Name select entry; foreach (var h in host) { if (!h.IPAddresses.Contains(address.Address)) { h.IPAddresses.Add(address.Address); } HostUpdated?.Invoke(this, h); } } } }; _mdns.Start(); ScheduleKeepAliveCheck(); }