コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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();
            }
        }
コード例 #4
0
        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();
        }