Esempio n. 1
0
        void FindNetworkInterfaces()
        {
            var nics = NetworkInterface.GetAllNetworkInterfaces()
                       .Where(nic => nic.OperationalStatus == OperationalStatus.Up)
                       .Where(nic => nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                       .Where(nic => nic.SupportsMulticast)
                       .Where(nic => !knownNics.Any(k => k.Id == nic.Id))
                       .ToArray();

            foreach (var nic in nics)
            {
                lock (socketLock)
                {
                    if (socket == null)
                    {
                        return;
                    }

                    IPInterfaceProperties properties = nic.GetIPProperties();
                    if (ip6)
                    {
                        var interfaceIndex = properties.GetIPv6Properties().Index;
                        var mopt           = new IPv6MulticastOption(MulticastAddressIp6, interfaceIndex);
                        socket.SetSocketOption(
                            SocketOptionLevel.IPv6,
                            SocketOptionName.AddMembership,
                            mopt);
                        maxPacketSize = Math.Min(maxPacketSize, properties.GetIPv6Properties().Mtu - packetOverhead);
                    }
                    else
                    {
                        var interfaceIndex = properties.GetIPv4Properties().Index;
                        var mopt           = new MulticastOption(MulticastAddressIp4, interfaceIndex);
                        socket.SetSocketOption(
                            SocketOptionLevel.IP,
                            SocketOptionName.AddMembership,
                            mopt);
                        maxPacketSize = Math.Min(maxPacketSize, properties.GetIPv4Properties().Mtu - packetOverhead);
                    }
                    knownNics.Add(nic);
                }
            }

            // Tell others.
            if (nics.Length > 0)
            {
                lock (socketLock)
                {
                    if (socket == null)
                    {
                        return;
                    }
                    NetworkInterfaceDiscovered?.Invoke(this, new NetworkInterfaceEventArgs
                    {
                        NetworkInterfaces = nics
                    });
                }
            }
        }
Esempio n. 2
0
        void FindNetworkInterfaces()
        {
            var currentNics = GetNetworkInterfaces().ToList();
            var newNics     = new List <NetworkInterface>();
            var oldNics     = new List <NetworkInterface>();

            lock (senderLock)
            {
                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;

            // If any NIC change, then get new sockets.
            if (newNics.Any() || oldNics.Any())
            {
                // Recreate the sender
                if (sender != null)
                {
                    sender.Dispose();
                }
                sender = new UdpClient(mdnsEndpoint.AddressFamily);
                sender.JoinMulticastGroup(mdnsEndpoint.Address);
                sender.MulticastLoopback = true;

                // Start a task to listen for MDNS messages.
                Listener();
            }

            // Tell others.
            if (newNics.Any())
            {
                NetworkInterfaceDiscovered?.Invoke(this, new NetworkInterfaceEventArgs
                {
                    NetworkInterfaces = newNics
                });
            }
        }
        void FindNetworkInterfaces()
        {
            var currentNics = GetNetworkInterfaces().ToList();
            var newNics     = new List <NetworkInterface>();
            var oldNics     = new List <NetworkInterface>();

            lock (senderLock)
            {
                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;

            // If any NIC change, then get new sockets.
            if (newNics.Any() || oldNics.Any())
            {
                RecreateSender();
                RecreateReceiver();
            }

            // Tell others.
            if (newNics.Any())
            {
                NetworkInterfaceDiscovered?.Invoke(this, new NetworkInterfaceEventArgs
                {
                    NetworkInterfaces = newNics
                });
            }
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
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);
            }
        }
Esempio n. 6
0
        void FindNetworkInterfaces()
        {
            log.Debug("Finding network interfaces");

            try
            {
                var currentNics = GetLinkLocalAddresses().ToList();

                var newNics = new List <IPAddress>();
                var oldNics = new List <IPAddress>();

                foreach (var nic in knownIPs?.Where(k => !currentNics.Any(n => k.Equals(n))))
                {
                    oldNics.Add(nic);

                    if (log.IsDebugEnabled)
                    {
                        log.Debug($"Removed ip '{nic}'.");
                    }
                }

                foreach (var nic in currentNics.Where(nic => !knownIPs.Any(k => k.Equals(nic))))
                {
                    newNics.Add(nic);

                    if (log.IsDebugEnabled)
                    {
                        log.Debug($"Found ip '{nic}'.");
                    }
                }

                knownIPs = currentNics;

                // Only create client if something has changed.
                if (newNics.Any() || oldNics.Any())
                {
                    client?.Dispose();
                    client = new MulticastClient(UseIpv4, UseIpv6, knownIPs);
                    client.MessageReceived += OnDnsMessage;
                }

                // Tell others.
                if (newNics.Any())
                {
                    NetworkInterfaceDiscovered?.Invoke(this, new IPEventArgs
                    {
                        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);
            }
        }
Esempio n. 7
0
        void FindNetworkInterfaces()
        {
            var nics = GetNetworkInterfaces()
                       .Where(nic => !knownNics.Any(k => k.Id == nic.Id))
                       .ToArray();

            foreach (var nic in nics)
            {
                lock (socketLock)
                {
                    if (socket == null)
                    {
                        return;
                    }

                    IPInterfaceProperties properties = nic.GetIPProperties();
                    if (ip6)
                    {
                        var ipProperties   = properties.GetIPv6Properties();
                        var interfaceIndex = ipProperties.Index;
                        var mopt           = new IPv6MulticastOption(MulticastAddressIp6, interfaceIndex);
                        socket.SetSocketOption(
                            SocketOptionLevel.IPv6,
                            SocketOptionName.AddMembership,
                            mopt);
                        if (ipProperties.Mtu > packetOverhead)
                        {
                            // Only change maxPacketSize if Mtu is available (and it that is not the case on MacOS)
                            maxPacketSize = Math.Min(maxPacketSize, ipProperties.Mtu - packetOverhead);
                        }
                    }
                    else
                    {
                        var ipProperties   = properties.GetIPv4Properties();
                        var interfaceIndex = ipProperties.Index;
                        var mopt           = new MulticastOption(MulticastAddressIp4, interfaceIndex);
                        socket.SetSocketOption(
                            SocketOptionLevel.IP,
                            SocketOptionName.AddMembership,
                            mopt);
                        if (ipProperties.Mtu > packetOverhead)
                        {
                            // Only change maxPacketSize if Mtu is available (and it that is not the case on MacOS)
                            maxPacketSize = Math.Min(maxPacketSize, ipProperties.Mtu - packetOverhead);
                        }
                    }
                    knownNics.Add(nic);
                }
            }

            // Tell others.
            if (nics.Length > 0)
            {
                lock (socketLock)
                {
                    if (socket == null)
                    {
                        return;
                    }
                    NetworkInterfaceDiscovered?.Invoke(this, new NetworkInterfaceEventArgs
                    {
                        NetworkInterfaces = nics
                    });
                }
            }
        }