diff --git a/src/Mdns.csproj b/src/Mdns.csproj index f7e9b7f..f30d559 100644 --- a/src/Mdns.csproj +++ b/src/Mdns.csproj @@ -31,6 +31,7 @@ + diff --git a/src/MulticastService.cs b/src/MulticastService.cs index 58792b9..6d5cb94 100644 --- a/src/MulticastService.cs +++ b/src/MulticastService.cs @@ -28,6 +28,11 @@ public class MulticastService : IResolver, IDisposable static readonly ILog log = LogManager.GetLogger(typeof(MulticastService)); static readonly IPAddress MulticastAddressIp4 = IPAddress.Parse("224.0.0.251"); static readonly IPAddress MulticastAddressIp6 = IPAddress.Parse("FF02::FB"); + static readonly IPNetwork[] linkLocalNetworks = new IPNetwork[] + { + IPNetwork.Parse("169.254.0.0/16"), + IPNetwork.Parse("fe80::/10") + }; const int MulticastPort = 5353; // IP header (20 bytes for IPv4; 40 bytes for IPv6) and the UDP header(8 bytes). @@ -152,6 +157,23 @@ public static IEnumerable GetIPAddresses() .Select(u => u.Address); } + /// + /// Get the link local IP addresses of the local machine. + /// + /// + /// A sequence of IP addresses. + /// + /// + /// All IPv4 addresses are considered link local. + /// + /// + public static IEnumerable GetLinkLocalAddresses() + { + return GetIPAddresses() + .Where(a => a.AddressFamily == AddressFamily.InterNetwork || + (a.AddressFamily == AddressFamily.InterNetworkV6 && a.IsIPv6LinkLocal)); + } + /// /// Start the service. /// diff --git a/src/ServiceProfile.cs b/src/ServiceProfile.cs index 30ba289..4492e44 100644 --- a/src/ServiceProfile.cs +++ b/src/ServiceProfile.cs @@ -73,7 +73,7 @@ public ServiceProfile(string instanceName, string serviceName, ushort port, IEnu Strings = { "txtvers=1" } }); - foreach (var address in addresses ?? MulticastService.GetIPAddresses()) + foreach (var address in addresses ?? MulticastService.GetLinkLocalAddresses()) { Resources.Add(AddressRecord.Create(HostName, address)); }