/// <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.LogDebug("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); Log.LogDebug($"Removed nic '{nic.Name}'."); } foreach (var nic in currentNics.Where(nic => !_knownNics.Any(k => k.Id == nic.Id))) { newNics.Add(nic); Log.LogDebug($"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.LogError("FindNics failed", e); } }