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