/// <summary> /// Stop the service. /// </summary> /// <remarks> /// Clears all the event handlers. /// </remarks> public void Stop() { // All event handlers are cleared. QueryReceived = null; AnswerReceived = null; NetworkInterfaceDiscovered = null; // Stop current UDP listener client?.Dispose(); client = null; }
void FindNetworkInterfaces() { log.Debug("Finding network interfaces"); try { var currentNics = GetNetworkInterfaces().ToList(); var newNics = new List <NetworkInterface>(); var oldNics = new List <NetworkInterface>(); foreach (var nic in knownNics.Where(k => !currentNics.Any(n => k.Id == n.Id))) { oldNics.Add(nic); if (log.IsDebugEnabled) { log.Debug($"Removed nic '{nic.Name}'."); } } foreach (var nic in currentNics.Where(nic => !knownNics.Any(k => k.Id == nic.Id))) { newNics.Add(nic); if (log.IsDebugEnabled) { log.Debug($"Found nic '{nic.Name}'."); } } knownNics = currentNics; // Only create client if something has change. if (newNics.Any() || oldNics.Any()) { client?.Dispose(); client = new MulticastClient(UseIpv4, UseIpv6, networkInterfacesFilter?.Invoke(knownNics) ?? knownNics); client.MessageReceived += OnDnsMessage; } // Tell others. if (newNics.Any()) { NetworkInterfaceDiscovered?.Invoke(this, new NetworkInterfaceEventArgs { NetworkInterfaces = newNics }); } // Magic from @eshvatskyi // // I've seen situation when NetworkAddressChanged is not triggered // (wifi off, but NIC is not disabled, wifi - on, NIC was not changed // so no event). Rebinding fixes this. // NetworkChange.NetworkAddressChanged -= OnNetworkAddressChanged; NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged; } catch (Exception e) { log.Error("FindNics failed", e); } }
void FindNetworkInterfaces() { log.Debug("Finding network interfaces"); try { var currentNics = GetNetworkInterfaces().ToList(); var newNics = new List <NetworkInterface>(); var oldNics = new List <NetworkInterface>(); foreach (var nic in knownNics.Where(k => currentNics.All(c => k.Id != c.Id || !DoesNicsHaveSameUnicastAddresses(k, c)))) { oldNics.Add(nic); if (log.IsDebugEnabled) { log.Debug($"Removed nic '{nic.Name}'."); } } foreach (var nic in currentNics.Where(c => knownNics.All(k => k.Id != c.Id || !DoesNicsHaveSameUnicastAddresses(k, c)))) { newNics.Add(nic); if (log.IsDebugEnabled) { log.Debug($"Found nic '{nic.Name}'."); } } knownNics = currentNics; // Only create client if something has change. if (newNics.Any() || oldNics.Any()) { client?.Dispose(); client = new MulticastClient(UseIpv4, UseIpv6, networkInterfacesFilter?.Invoke(knownNics) ?? knownNics); client.MessageReceived += OnDnsMessage; } // Tell others. if (newNics.Any()) { NetworkInterfaceDiscovered?.Invoke(this, new NetworkInterfaceEventArgs { NetworkInterfaces = newNics }); } // Magic from @eshvatskyi // // I've seen situation when NetworkAddressChanged is not triggered // (wifi off, but NIC is not disabled, wifi - on, NIC was not changed // so no event). Rebinding fixes this. // // Do magic only on Windows. #if NET461 if (Environment.OSVersion.Platform.ToString().StartsWith("Win")) #else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) #endif { NetworkChange.NetworkAddressChanged -= OnNetworkAddressChanged; NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged; } } catch (Exception e) { log.Error("FindNics failed", e); } }