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; }
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); } }