如果你不能依赖于从DNS服务器获取你的IP地址(这发生在我身上),你可以使用以下方法:
System.Net.NetworkInformation命名空间包含一个NetworkInterface类,该类有一个静态的GetAllNetworkInterfaces方法。
此方法将返回您机器上的所有“网络接口”,而且通常有相当多的“网络接口”,即使您的机器上只安装了无线适配器和/或以太网适配器硬件。所有这些网络接口都有本地计算机的有效IP地址,尽管您可能只需要一个。
如果您正在寻找一个IP地址,那么您将需要筛选列表,直到您可以识别正确的地址。你可能需要做一些实验,但我成功地采用了以下方法:
通过检查OperationalStatus == OperationalStatus. up过滤掉任何非活动的网络接口。这将排除您的物理以太网适配器,例如,如果您没有插入网线。
对于每个NetworkInterface,你可以使用GetIPProperties方法获得一个IPInterfaceProperties对象,并且从一个IPInterfaceProperties对象中,你可以访问UnicastIPAddressInformation对象列表的UnicastAddresses属性。
通过检查DuplicateAddressDetectionState == DuplicateAddressDetectionState过滤掉非首选单播地址。首选
通过检查AddressPreferredLifetime != UInt32.MaxValue过滤出“虚拟”地址。
此时,我取与所有这些过滤器匹配的第一个单播地址(如果有的话)的地址。
编辑:
[2018年5月16日修订的代码,以包括上述文本中提到的重复地址检测状态和首选生存期的条件]
下面的示例演示了基于操作状态、地址族、排除环回地址(127.0.0.1)、重复地址检测状态和首选生存期的过滤。
static IEnumerable<IPAddress> GetLocalIpAddresses()
{
// Get the list of network interfaces for the local computer.
var adapters = NetworkInterface.GetAllNetworkInterfaces();
// Return the list of local IPv4 addresses excluding the local
// host, disconnected, and virtual addresses.
return (from adapter in adapters
let properties = adapter.GetIPProperties()
from address in properties.UnicastAddresses
where adapter.OperationalStatus == OperationalStatus.Up &&
address.Address.AddressFamily == AddressFamily.InterNetwork &&
!address.Equals(IPAddress.Loopback) &&
address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
address.AddressPreferredLifetime != UInt32.MaxValue
select address.Address);
}