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