private bool ValidateIpAddress(string ipAddress)
{
if (IPAddress.TryParse(ipAddress, out IPAddress address) && address.ToString()==ipAddress)
{
switch (address.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
return true;
case System.Net.Sockets.AddressFamily.InterNetworkV6:
return true;
}
}
return false;
}
我正在使用此方法验证我的字符串是否为ipv4或ipv6地址,但在测试-2001:0db8:85a3:0000:0000:8a2e:0370:7334时显示无效
答案 0 :(得分:1)
这是因为您还检查IP地址的字符串表示形式是否与您输入的内容相同:
if (... && address.ToString()==ipAddress)
可以正确解析有问题的地址,但可以将其写为缩写形式,但是以下两个字符串不相等:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
2001:db8:85a3::8a2e:370:7334
我还要指出,大写与十六进制表示形式无关,因此至少应进行不区分大小写的比较。但是总的来说,我可能会放弃字符串必须匹配的要求(如果您已经确定字符串 是有效的IP地址,为什么必须这样做?)。如果绝对必须保留该要求,则可能必须手动将地址转换为所需的格式。
编辑:显然,您的IPv4地址必须具有特定的格式,因此您还可以通过正则表达式来验证常规结构:
var regex = @"(?ix)
^\d+(\.\d+){3}$ # IPv4 address with all four octets
|
^[0-9a-f]{4}(:[0-9a-f]{4}){7}$ # IPv6 address without any shortening";
if (... && Regex.IsMatch(ipAddress, regex))
现在,虽然这是蠕虫的另一种形式,但是由于IPAddress
对地址的验证对您来说还不够严格,因此这将增加强制特定格式的灵活性。