public Task Start()
        {
            _mdns.QueryReceived += _mdns_QueryReceived;

            var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

            foreach (var network in networkInterfaces)
            {
                _logger.LogDebug(
                    $"Interface {network.Name}, Type {network.NetworkInterfaceType}, OP Status {network.OperationalStatus}, IP {network.GetIPProperties().UnicastAddresses.FirstOrDefault()}");
            }

            var weUseAddresses = MulticastService.GetIpAddresses();

            foreach (var ip in weUseAddresses)
            {
                _logger.LogDebug($"We use {ip}");
            }

            var startMessage = new Message();
            startMessage.AuthorityRecords.Add(new SRVRecord
            {
                Name = $"{_name}.{DnsHapDomain}",
                Port = _port,
                Target = $"{_hapId.Replace(":", "_")}.local"
            });

            var q = new Question
            {
                Type = DnsType.ANY,
                Name = $"{_name}.{DnsHapDomain}",
                QU = true,
                Class = DnsClass.IN
            };
            startMessage.Questions.Add(q);

            _mdns.Start();

#pragma warning disable 4014
            Task.Run(async () =>
            {
                _mdns.SendQuery(startMessage);
                await Task.Delay(1000);
                q.QU = false;
                _mdns.SendQuery(startMessage);
                await Task.Delay(1000);
                _mdns.SendQuery(startMessage);
                await Task.Delay(1000);
            }).ConfigureAwait(false);
#pragma warning restore 4014
            return Task.CompletedTask;
        }
示例#2
0
        private void _mdns_QueryReceived(object sender, MessageEventArgs e)
        {
            if (e.Message.IsQuery &&
                (e.Message.Questions.Any(a => a.Name.Labels.Contains(HapName))) ||
                e.Message.Questions.Any(a => a.Name == ServiceDiscovery.ServiceName))
            {
                var localAddresses = MulticastService.GetIpAddresses();
                var dnsMessage     = GenerateQueryResponseMessage();

                foreach (var localAddress in localAddresses)
                {
                    if (localAddress.AddressFamily == AddressFamily.InterNetwork)
                    {
                        dnsMessage.Answers.Add(new ARecord
                        {
                            Name    = $"{_hapId.Replace(":", "_")}.local",
                            Address = localAddress,
                            Class   = DnsClass.IN,
                            Type    = DnsType.A,
                            TTL     = TimeSpan.FromMinutes(2)
                        });
                    }
                    else if (localAddress.AddressFamily == AddressFamily.InterNetworkV6)
                    {
                        dnsMessage.Answers.Add(new AAAARecord
                        {
                            Name    = $"{_hapId.Replace(":", "_")}.local",
                            Address = localAddress,
                            Class   = DnsClass.IN,
                            Type    = DnsType.AAAA,
                            TTL     = TimeSpan.FromMinutes(2)
                        });
                    }
                }

                _mdns.SendAnswer(dnsMessage, e);
            }
        }