如何以编程方式获取计算机的本地networkingIP地址? (C#)
我需要从我的程序中使用C#和.NET 3.5获得计算机的实际本地networkingIP地址(例如192.168.0.220)。 在这种情况下我不能只使用127.0.0.1。
什么是最好的方法来做到这一点?
链接它在那里说,添加System.net,并使用以下
//To get the local IP address string sHostName = Dns.GetHostName (); IPHostEntry ipE = Dns.GetHostByName (sHostName); IPAddress [] IpA = ipE.AddressList; for (int i = 0; i < IpA.Length; i++) { Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString ()); }
如果您正在查找命令行实用程序ipconfig可以提供的那种信息,则应该使用System.Net.NetworkInformation命名空间。
此示例代码将枚举所有networking接口并转储每个适配器已知的地址。
using System; using System.Net; using System.Net.NetworkInformation; class Program { static void Main(string[] args) { foreach ( NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() ) { Console.WriteLine("Network Interface: {0}", netif.Name); IPInterfaceProperties properties = netif.GetIPProperties(); foreach ( IPAddress dns in properties.DnsAddresses ) Console.WriteLine("\tDNS: {0}", dns); foreach ( IPAddressInformation anycast in properties.AnycastAddresses ) Console.WriteLine("\tAnyCast: {0}", anycast.Address); foreach ( IPAddressInformation multicast in properties.MulticastAddresses ) Console.WriteLine("\tMultiCast: {0}", multicast.Address); foreach ( IPAddressInformation unicast in properties.UnicastAddresses ) Console.WriteLine("\tUniCast: {0}", unicast.Address); } } }
您可能最感兴趣的是UnicastAddresses。
使用Dns要求您的计算机在本地DNS服务器上注册,如果您在Intranet上,则不一定是这样,如果您在家中使用ISP,则更不可能。 它还需要一个networking往返 – 所有这些都可以find关于你自己电脑的信息。
正确的方法是:
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); foreach(NetworkInterface adapter in nics) { foreach(var x in adapter.GetIPProperties().UnicastAddresses) { if (x.Address.AddressFamily == AddressFamily.InterNetwork && x.IsDnsEligible) { Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString()); } } }
(更新2015年7月31日:修正了代码中的一些问题)
或者对于那些只喜欢Linq的人来说:
NetworkInterface.GetAllNetworkInterfaces() .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses) .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork && adr.IsDnsEligible) .Select (adr => adr.Address.ToString());
作为一台机器可以有多个IP地址,找出你将用于路由到一般互联网的IP地址的正确方法是打开一个到互联网上的主机的套接字,然后检查套接字连接看看在这个连接中使用的本地地址是什么。
通过检查套接字连接,你将能够考虑怪异的路由表,多个IP地址和怪异的主机名。 上面的主机名可以工作,但我不认为它是完全可靠的。
如果您知道您的计算机有一个或多个IPv4地址,则会提供其中一个地址:
Dns.GetHostAddresses(Dns.GetHostName()) .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString()
GetHostAddresses
通常在查询DNS服务器时阻塞调用线程,如果查询失败则抛出SocketException
。 在查找自己的主机名时,我不知道是否跳过了networking调用。