/// <summary> /// Returns true if the server is running in a local LAN /// </summary> private static bool ServerIsInLocalLan(IPEndPoint serverEndPoint) { var ownNetwork = LunaNetUtils.GetOwnInternalIPv6Network(); if (ownNetwork != null && serverEndPoint.AddressFamily == AddressFamily.InterNetworkV6) { // For IPv6, we strip both addresses down to the subnet portion (likely the first 64 bits) and compare them. // Because we only receive Global Unique Addresses from GetOwnInternalIPv6Network() (which are globally // unique, as the name suggests and the RFCs define), those being equal should mean both are on the same network. var ownBytes = ownNetwork.Address.GetAddressBytes(); var serverBytes = serverEndPoint.Address.GetAddressBytes(); // TODO IPv6: We currently assume an on-link prefix length of 64 bits, which is the most common case // and standardized as per the RFCs. UnicastIPAddressInformation.PrefixLength is not implemented yet, // and also wouldn't be reliable (hosts often assign their address as /128). A possible solution could be // checking whether serverEndPoint matches any configured on-link/no-gateway route. Array.Resize(ref ownBytes, 8); Array.Resize(ref serverBytes, 8); if (ownBytes == serverBytes) { return(true); } } return(Equals(LunaNetUtils.GetOwnExternalIpAddress(), serverEndPoint.Address)); }