diff --git a/CHANGELOG.md b/CHANGELOG.md index 63a0bfcb9..c28e0539e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# Upcoming +### Server +* Fix: AddressFamilyNotSupported error when server does not have IPv6 + # v4.6.544 ### Client * Fix: App Filter does not work when no app is selected diff --git a/Pub/PubVersion.json b/Pub/PubVersion.json index c07e0408a..6f678b4d7 100644 --- a/Pub/PubVersion.json +++ b/Pub/PubVersion.json @@ -1,6 +1,6 @@ { - "Version": "4.6.544", + "Version": "4.6.545", "BumpTime": "2024-07-15T05:08:21.3508028Z", - "Prerelease": false, + "Prerelease": true, "DeprecatedVersion": "4.0.00" } diff --git a/VpnHood.Common/Net/IPAddressUtil.cs b/VpnHood.Common/Net/IPAddressUtil.cs index e0c76c78a..bf6efb0ab 100644 --- a/VpnHood.Common/Net/IPAddressUtil.cs +++ b/VpnHood.Common/Net/IPAddressUtil.cs @@ -97,8 +97,15 @@ public static async Task GetPublicIpAddresses() public static Task GetPrivateIpAddress(AddressFamily addressFamily) { - using var udpClient = new UdpClient(addressFamily); - return GetPrivateIpAddress(udpClient); + try + { + using var udpClient = new UdpClient(addressFamily); // it may throw exception + return GetPrivateIpAddress(udpClient); + } + catch + { + return Task.FromResult(null); + } } public static Task GetPrivateIpAddress(UdpClient udpClient) diff --git a/VpnHood.Server.App.Net/VpnHood.Server.App.Net.csproj b/VpnHood.Server.App.Net/VpnHood.Server.App.Net.csproj index 6b8f93823..b87f419c5 100644 --- a/VpnHood.Server.App.Net/VpnHood.Server.App.Net.csproj +++ b/VpnHood.Server.App.Net/VpnHood.Server.App.Net.csproj @@ -22,7 +22,7 @@ VpnHood.png https://github.com/vpnhood/vpnhood https://github.com/vpnhood/vpnhood - 4.6.544 + 4.6.545 $([System.DateTime]::Now.ToString("yyyy.M.d.HHmm")) VpnHoodServer diff --git a/VpnHood.Server/VpnHoodServer.cs b/VpnHood.Server/VpnHoodServer.cs index 22941a60d..78cb30336 100644 --- a/VpnHood.Server/VpnHoodServer.cs +++ b/VpnHood.Server/VpnHoodServer.cs @@ -119,20 +119,26 @@ private async Task Configure() { try { + VhLogger.Instance.LogInformation("Configuring by the Access Manager..."); State = ServerState.Configuring; // get server info - VhLogger.Instance.LogInformation("Configuring by the Access Manager..."); - var providerSystemInfo = SystemInfoProvider.GetSystemInfo(); + VhLogger.Instance.LogTrace("Finding free EndPoints..."); var freeUdpPortV4 = ServerUtil.GetFreeUdpPort(AddressFamily.InterNetwork, null); var freeUdpPortV6 = ServerUtil.GetFreeUdpPort(AddressFamily.InterNetworkV6, freeUdpPortV4); - var serverInfo = new ServerInfo - { + VhLogger.Instance.LogTrace("Finding public addresses..."); + var privateIpAddresses = await IPAddressUtil.GetPrivateIpAddresses().VhConfigureAwait(); + + VhLogger.Instance.LogTrace("Finding public addresses..., PublicIpDiscovery: {PublicIpDiscovery}", _publicIpDiscovery); + var publicIpAddresses = _publicIpDiscovery ? await IPAddressUtil.GetPublicIpAddresses().VhConfigureAwait() : []; + + var providerSystemInfo = SystemInfoProvider.GetSystemInfo(); + var serverInfo = new ServerInfo { EnvironmentVersion = Environment.Version, Version = ServerVersion, - PrivateIpAddresses = await IPAddressUtil.GetPrivateIpAddresses().VhConfigureAwait(), - PublicIpAddresses = _publicIpDiscovery ? await IPAddressUtil.GetPublicIpAddresses().VhConfigureAwait() : [], + PrivateIpAddresses = privateIpAddresses, + PublicIpAddresses = publicIpAddresses, Status = GetStatus(), MachineName = Environment.MachineName, OsInfo = providerSystemInfo.OsInfo, @@ -142,9 +148,9 @@ private async Task Configure() FreeUdpPortV4 = freeUdpPortV4, FreeUdpPortV6 = freeUdpPortV6 }; - - var publicIpV4 = serverInfo.PublicIpAddresses.SingleOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork); - var publicIpV6 = serverInfo.PublicIpAddresses.SingleOrDefault(x => x.AddressFamily == AddressFamily.InterNetworkV6); + + var publicIpV4 = serverInfo.PublicIpAddresses.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork); + var publicIpV6 = serverInfo.PublicIpAddresses.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetworkV6); var isIpV6Supported = publicIpV6 != null || await IPAddressUtil.IsIpv6Supported().VhConfigureAwait(); VhLogger.Instance.LogInformation("Public IPv4: {IPv4}, Public IPv6: {IpV6}, IsV6Supported: {IsV6Supported}", VhLogger.Format(publicIpV4), VhLogger.Format(publicIpV6), isIpV6Supported);