示例#1
0
        /// <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;
        }
示例#2
0
        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);
            }
        }