如何以编程方式获取计算机的本地网络IP地址? (C#)
时间:2020-03-06 14:54:07 来源:igfitidea点击:
我需要使用Cand .NET 3.5从我的程序中获取计算机的实际本地IP地址(例如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 ());
}
由于一台机器可以有多个IP地址,因此弄清将要用于路由到普通Internet的IP地址的正确方法是打开一个与Internet上的主机的套接字,然后检查该套接字的连接查看该连接中正在使用的本地地址是什么。
通过检查套接字连接,我们将能够考虑到怪异的路由表,多个ip地址和怪异的主机名。上面带有主机名的技巧可以起作用,但我认为它不是完全可靠的。
如果我们正在寻找命令行实用程序ipconfig可以提供的信息,则可能应该使用System.Net.NetworkInformation命名空间。
此示例代码将枚举所有网络接口,并转储每个适配器已知的地址。
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,则不一定是正确的。它还需要网络往返-全部以查找有关我们自己的计算机的信息。
正确的方法:
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());

