使用C#比较两个IP地址

14

如何比较两个IP地址?

string ip1 = "123.123.123.123";
string ip2 = "124.124.124.124";

我需要像这样的东西:

if(ip1 == ip2)
{
   //true
}

15
为什么你刚刚发布的代码不适合你的需求? - Luis
3
@Luis,因为同一个 IP 地址可以有不同的字符串表示方式,因为这些数字可以合法地用十六进制和十进制表示。 - JaredPar
1
@Luis:尝试这个:ping 2130706433 - R. Martinho Fernandes
6个回答

38

看起来 System.Net.IPAddress 定义了自己的Equals重写,所以这应该可以工作:

IPAddress ip1 = IPAddress.Parse("123.123.123.123");
IPAddress ip2 = IPAddress.Parse("124.124.124.124");

if(ip1.Equals(ip2))
{
    //...
}

@PhucNguyen - IPAddress.Parse("172.16.0.150").Equals(IPAddress.Parse("172.16.1.216")) 对我来说返回了期望的 false。 - Lee

20

在BCL中,IPAddress类型支持相等性(equality)并可用于此目的。

public static bool IsSameIPAddress(string ip1, string ip2) {
  IPAddress leftIP = IPAddress.Parse(ip1);
  IPAddress rightIP = IPAddress.Parse(ip2);
  return leftIP.Equals(rightIP);
}

很多人想知道为什么直接字符串比较不足够。原因是IP地址可以以十进制和十六进制表示法合法地呈现。因此,同一个IP地址可以有多个字符串表示。

例如:

var left = "0x5.0x5.0x5.0x5";
var right = "5.5.5.5";
IsSameIPAddress(left,right); // true
left == right; // false

4
@JaredPar:在你的第一段代码中,leftIP==rightIP会对相同的IP地址返回false!应该是return LeftIP.Equals(rightIP); - KMån
1
@KMan,我自己也注意到了并更新了我的帖子。感谢你指出来! - JaredPar
十六进制的东西对我来说很新奇。有趣。这在 IPv6 中变得更加糟糕,因为你不必使用::来缩短地址。 - Joey
我从未见过使用点分十六进制格式。非点分十六进制是可以的(0x05050505),但从未见过点分十六进制。 - Powerlord
@OMG Unicorns,至少就IPAddress.Parse支持的内容而言,这两种形式都是合法的。但我并不确定官方IP标准的具体规定。 - JaredPar

4

2
IPAddress addr1 = IPAddress.Parse(ip1);
IPAddress addr2 = IPAddress.Parse(ip2);

return (addr1.Equals(addr2));

1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接