我这里有一些代码在 IPv4 机器上运行良好,但在我们的构建服务器(IPv6)上却失败了。简而言之:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
GetHostEntry 的文档说,传入 string.Empty 将获得本地主机的 IPv4 地址。这就是我要的。问题是它在我们的 IPv6 机器上返回字符串“::1:”,我认为这是 IPv6 地址。
从任何其他 IPv4 机器 ping 机器会给出一个好的 IPv4 地址...并且从自身执行 “ping -4 machinename” 给出正确的 IPv4 地址...但是从自身定期 ping 给出“::1” :".
如何从这台机器本身获取 IPv4?
您是否查看了返回中的所有地址,丢弃了家族 InterNetworkV6 的地址,只保留 IPv4 的地址?
要查找所有本地 IPv4 地址:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
或者如果您只想要一个,请使用
Array.Find
或 Array.FindLast
。
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
public Form1()
{
InitializeComponent();
string myHost = System.Net.Dns.GetHostName();
string myIP = null;
for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
{
if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
{
myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString();
}
}
}
在公共变量中声明 myIP 和 myHost 并在该形式的任何函数中使用。
public static string GetIPAddress(string hostname)
{
IPHostEntry host;
host = Dns.GetHostEntry(hostname);
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
//System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip);
return ip.ToString();
}
}
return string.Empty;
}
可以解决许多问题的一件事是,如果编写“信息”的傻瓜将永远禁止世界“主机”。我们经常使用两个术语:“服务器”和“客户端”。但是,一旦我们谈论套接字或网络,我们就会突然使用“主机”。为什么?
要查找所有有效的地址列表,这是我使用的代码
public static IEnumerable<string> GetAddresses()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}
您可以使用以下代码从 DNS 获取所有 IPv4 地址:
IPs[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
address => address.AddressFamily == AddressFamily.InterNetwork);
IPv6
lblIP.Text = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(0).ToString()
IPv4
lblIP.Text = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(1).ToString()