2012-01-31 140 views
1

我想在本地机器上获取IP地址:获取和检查本地计算机的IP地址

private string GetIP() 
    { 

     string strHostName = ""; 
     strHostName = System.Net.Dns.GetHostName(); 

     IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName); 


     IPAddress[] addr = ipEntry.AddressList; 

     foreach (IPAddress ipaddr in addr) 
     { 
      if (ipaddr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
       return ipaddr.ToString(); 
     } 

     return "IP error";         
    } 

但是我无法找到一个方法来确定哪些接口是一个我需要的。例如:

enter image description here

我很幸运的是,我需要的是第二个在列表中。但如果它在后面,我会得到一个错误的界面IP。如何检查我是否获得IP用于本地连接(或通常,负责连接的接口)。

+0

你怎么能指望你程序知道它应该查看哪个NIC? – 2012-01-31 13:42:55

+0

这就是我不知道如何实现。现在只需要列表中的第一个InterNetwork。我想以某种方式验证它是本地连接。 – and 2012-01-31 13:51:33

+0

什么是所有在列表中的其他IP的,如果他们不属于本地连接? – 2012-01-31 13:52:38

回答

2

您可以直接(而不仅仅是他们的IPS)枚举network interfaces,然后筛选基于其接口类型:

var interfaces = NetworkInterface.GetAllNetworkInterfaces() 

然后用类似的东西过滤它:

interfaces.Where(ni => ni.NetworkInterfaceType != NetworkInterfaceType.Loopback && 
         ni.NetworkInterfaceType != NetworkInterfaceType.Tunnel) 

它仍然可以返回多个网络接口,但它会过滤掉至少他们中的一些你不想要的。我使用上面的过滤器来摆脱环回和虚拟机接口。

然后从那里你可以得到网络接口的IP地址使用IP properties

在简洁的精神,一旦你确定哪些接口是正确的,你可以用得到的接口的IPv4地址(或其中至少一个):

iface.GetIPProperties().UnicastAddresses.SingleOrDefault(ua => ua.Address.AddressFamily == AddressFamily.InterNetwork); 
+0

我之前尝试过,但是(手动选择正确的界面)IP属性让我错误的IP。它获取网关的IP。 – and 2012-01-31 14:15:43

+0

然后你不使用来自IP属性的正确属性。发布您使用的代码,我们可以帮助您。这里有一个提示,你关心的地址通常称为*单播*地址。 – 2012-01-31 14:16:37

+0

IPAddressCollection ips = currentNic.GetIPProperties()。DnsAddresses;错的吗? – and 2012-01-31 14:25:04

0

没有方法,对主机名

IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); 

它在你的DNS返回本地计算机的地址为所有登记地址

因此,如果你的DNS你的机器有一个返回一个地址名称与一个IP地址相关联,它将仅返回该地址,否则将返回与该主机名关联的地址列表

您必须“过滤”列表以了解您的本地地址

看一看下面:

How to get the IP address of the server on which my C# application is running on?

+1

对我说,返回相同的地址集与'GetHostEntry()'。 – svick 2012-01-31 13:45:21

+0

他们返回相同的信息,但他们的行为不同 http://msdn.microsoft.com/en-us/library/ms143998(v=vs.100)。aspx GetHostAddresses方法对于IP文字具有不同的行为。如果上述步骤#1成功(它成功解析为IP地址),则该地址将立即返回。没有尝试进行反向查找。 – 2012-01-31 13:51:59

+0

sivick说什么。 GetHostAddresses()或GetHostEntry()我得到一个列表。 – and 2012-01-31 13:52:59