Dns 类获取与 Internet 上的主机有关的信息。在 C# 中,Dns 类中有很多方法可以实现 DNS 相关功能。其中 Dns.GetHostEntry() 函数用于获取主机的 IP 地址。
以下代码示例向我们展示了如何使用 C# 中的 Dns.GetHostEntry() 函数获取计算机的本地 IP 地址。
using System;
using System.Net;
namespace get_local_ip_address
{
class Program
{
static void Main(string[] args)
{
IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in ipEntry.AddressList)
{
Console.WriteLine("IP Address: " + ip.ToString());
}
}
}
}
// 输出
IP Address 0: fe80::1db8:23a7:6483:8976%20
IP Address 1: 192.168.43.239
在上面的代码中,我们将 Dns.GetHostName() 函数作为 Dns.GetHostEntry() 函数的参数传递,以获取 C# 中本地计算机的 IP 地址。这种方法的唯一问题是,它为我们提供了机器的所有 IP 地址。要获取特定的 IP 地址,我们必须使用 C# 编写以下代码。
using System;
using System.Net;
namespace get_local_ip_address
{
class Program
{
static void Main(string[] args)
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
Console.WriteLine("IP Address = " + ip.ToString());
}
}
}
}
}
// 输出:
IP Address = 192.168.43.239
在上面的代码中,我们检查了 ip.AddressFamily 是否等于 AddressFamily.InterNetwork。此条件检查 ip 变量中的 IP 地址是否为 IPv4 地址。上面的代码仅返回我们计算机的 IPv4 地址。如果要获取本机的 IPv6 地址,可以使用 AddressFamily.InterNetworkV6 属性,而不是 AddressFamily.InterNetwork 属性。
当有多个 IP 地址时,获取我们机器的本地 IP 地址的一种更准确的方法是连接 UDP 套接字,然后读取其本地端点。C# 中的 Socket 类实现了 Berkeley 套接字接口,该接口提供了网络通信的功能。以下代码示例向我们展示了如何使用 Socket.LocalEndPoint 属性来确定我们的计算机在 C# 中的本地 IP 地址。
using System;
using System.Net;
using System.Net.Sockets;
namespace get_local_ip_address
{
class Program
{
static void Main(string[] args)
{
string localIP = string.Empty;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
localIP = endPoint.Address.ToString();
}
Console.WriteLine("IP Address = " + localIP);
}
}
}
// 输出:
IP Address = 192.168.43.239
在上面的代码中,我们将 socket 套接字连接到我们的本地计算机,并使用 socket.LocalEndPoint 属性提取了 socket 的本地端点。我们使用 endPoint.Address 属性来获取 endPoint 的 IP 地址。
Linq 或语言集成查询提供了 C# 中的 SQL 功能。我们还可以使用 Linq 和 Dns.GetHostEntry() 函数在 C# 中获取我们计算机的本地 IP 地址。
以下代码示例向我们展示了如何使用 Linq 在 C# 中获取计算机的本地 IP 地址。
using System;
using System.Linq;
using System.Net;
namespace get_local_ip_address
{
class Program
{
static void Main(string[] args)
{
if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
Console.WriteLine("No Network Available");
}
IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
var ippaddress = host
.AddressList
.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
Console.WriteLine(ippaddress);
}
}
}
// 输出:
192.168.43.239
在上面的代码中,我们使用 C# 中的 Linq 的 Dns.GetHostEntry() 函数确定了计算机的本地 IPv4 地址。其余代码类似于我们的第一个示例;唯一的区别是,我们从 Dns.GetHostEntry() 函数返回的地址列表中仅提取了一个 IPv4 地址。
NetworkInterface 类包含有关本地计算机上网络接口的数据并提供网络接口的统计信息和配置。NetworkInterface 类中的 GetAllNetworkInterfaces() 函数为我们提供了本地计算机上的所有网络接口。使用了 NetworkInterface 类中的 NetworkInterfaceType 属性获取网络接口的类型。
以下代码示例显示了我们如何使用所有这些功能来获取 C# 中本地计算机的本地 IP 地址。
using System;
using System.Linq;
using System.Net;
namespace get_local_ip_address
{
class Program
{
public static void getLocalIPAddressWithNetworkInterface(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
Console.WriteLine("IP Address = " + output);
}
static void Main(string[] args)
{
getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Wireless80211);
}
}
}
// 输出:
IP Address = 192.168.43.239
在上面的代码中,我们使用 C# 中的 NetworkInterface 类检索了本地计算机的 WLAN IPv4 地址。上面的代码可用于获取我们本地计算机上的任何类型的 IP 地址。例如,如果要获取以太网接口的 IP 地址,则必须在函数调用中通过传递 NetworkInterfaceType.Ethernet 来指定它。