在使用 .NET MAUI 获取局域网 IP 地址时,可能会遇到只获取到本地回环地址 127.0.0.1 的问题。这是因为 Dns.GetHostEntry
方法默认只返回主机的名称和 IP 地址,而不包括 DHCP 分配的 IP 地址。
要获取 DHCP 分配的 IP 地址,你可以尝试使用 NetworkInterface
类来获取本地网络接口的信息。以下是一个示例代码,可以获取到 DHCP 分配的 IP 地址:
using System.Net.NetworkInformation;
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var networkInterface in networkInterfaces)
{
if (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
{
var ipProperties = networkInterface.GetIPProperties();
var unicastAddresses = ipProperties.UnicastAddresses;
foreach (var unicastAddress in unicastAddresses)
{
if (unicastAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
var dhcpAddress = unicastAddress.Address.ToString();
// 这里可以对获取到的 DHCP 分配的 IP 地址进行处理或输出
Console.WriteLine(dhcpAddress);
}
}
}
}
上述代码会遍历所有的网络接口,筛选出以太网和无线网卡接口,并获取每个接口的 IP 属性。然后,通过筛选出 IP 地址族为 InterNetwork
的地址,获取到 DHCP 分配的 IP 地址。
在.NET MAUI中,您可以使用以下方法获取局域网的IP地址:
csharp
Copy code
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
// ...
public static string GetLocalIPAddress()
{
string ipAddress = string.Empty;
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface networkInterface in networkInterfaces)
{
if (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
{
IPInterfaceProperties properties = networkInterface.GetIPProperties();
foreach (UnicastIPAddressInformation ip in properties.UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(ip.Address))
{
ipAddress = ip.Address.ToString();
break;
}
}
}
if (!string.IsNullOrEmpty(ipAddress))
{
break;
}
}
return ipAddress;
}
上述代码遍历了所有的网络接口,并找到第一个以太网或无线接口(Ethernet 或 Wireless80211)。然后,它获取该接口的 IP 属性,并在其中查找第一个 IPv4 地址(AddressFamily.InterNetwork)并排除回环地址。这样,您将获得局域网的 IP 地址。
您可以调用 GetLocalIPAddress 方法来获取局域网的 IP 地址。
csharp
Copy code
string localIpAddress = GetLocalIPAddress();
Console.WriteLine(localIpAddress);
请注意,由于网络环境和配置可能会有所不同,这种方法仍然可能无法获取正确的 IP 地址。在某些情况下,网络接口可能未配置或未连接到局域网。确保您的设备已正确连接到网络,并且有一个有效的 IP 地址。
最近遇到过这个问题,找过很多办法,最后发现还是下面的最好用。
public string GetLocalIPv4()
{
try
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Connect(new IPEndPoint(IPAddress.Parse("8.8.8.8"), 53));
string ip = ((IPEndPoint)s.LocalEndPoint).Address.ToString();
s.Close();
return ip;
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
return null;
}
}