Skip to content

Commit 0d2d278

Browse files
committed
[修改] 修改IP验证异常的问题
1 parent cdcdcf1 commit 0d2d278

1 file changed

Lines changed: 20 additions & 3 deletions

File tree

GameFrameX.Utility/NetHelper.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Net;
1+
using System.Net;
22
using System.Net.NetworkInformation;
33
using System.Net.Sockets;
44

@@ -34,7 +34,23 @@ public static bool IsValidIpAddress(string ipAddress, out IPAddress value)
3434
{
3535
ArgumentNullException.ThrowIfNull(ipAddress, nameof(ipAddress));
3636

37-
return IPAddress.TryParse(ipAddress, out value);
37+
value = null;
38+
39+
// 首先尝试解析IP地址
40+
if (!IPAddress.TryParse(ipAddress, out var parsedIp))
41+
{
42+
return false;
43+
}
44+
45+
// 验证解析后的IP地址字符串表示是否与原始输入完全匹配
46+
// 这可以防止IPAddress.TryParse自动补全不完整的IP地址(如"192.168.1"被解析为"192.168.0.1")
47+
if (parsedIp.ToString() != ipAddress)
48+
{
49+
return false;
50+
}
51+
52+
value = parsedIp;
53+
return true;
3854
}
3955

4056
/// <summary>
@@ -321,6 +337,7 @@ public static List<int> GetAvailablePorts(int startPort, int endPort, int maxCou
321337
/// <param name="timeout">超时时间(毫秒),默认10000毫秒</param>
322338
/// <returns>公网IP地址字符串,获取失败返回null</returns>
323339
/// <exception cref="ArgumentOutOfRangeException">当timeout小于0时抛出此异常</exception>
340+
#nullable enable
324341
public static async Task<string?> GetPublicIpAddressAsync(int timeout = 10000)
325342
{
326343
ArgumentOutOfRangeException.ThrowIfNegative(timeout, nameof(timeout));
@@ -365,7 +382,7 @@ public static bool IsPrivateIpAddress(string ipAddress)
365382
{
366383
ArgumentException.ThrowIfNullOrEmpty(ipAddress, nameof(ipAddress));
367384

368-
if (!IPAddress.TryParse(ipAddress, out var ip))
385+
if (!IsValidIpAddress(ipAddress, out var ip))
369386
{
370387
throw new ArgumentException("无效的IP地址格式", nameof(ipAddress));
371388
}

0 commit comments

Comments
 (0)