从 Dns.GetHostEntry() 获取 IPv4 地址
Posted
技术标签:
【中文标题】从 Dns.GetHostEntry() 获取 IPv4 地址【英文标题】:Get IPv4 addresses from Dns.GetHostEntry() 【发布时间】:2010-11-06 18:26:30 【问题描述】:我这里有一些代码在 IPv4 机器上运行良好,但在我们的构建服务器(IPv6)上却失败了。简而言之:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
GetHostEntry 的文档说传入 string.Empty 将为您获取 localhost 的 IPv4 地址。这就是我要的。问题是它在我们的 IPv6 机器上返回字符串“::1:”,我认为它是 IPv6 地址。
从任何其他 IPv4 机器上 ping 机器会得到一个好的 IPv4 地址...并从自身执行 "ping -4 machinename" 会得到正确的 IPv4 地址...。但定期 ping 它from 本身给出“::1:”。
我怎样才能从它本身获得这台机器的 IPv4?
【问题讨论】:
【参考方案1】:IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
【讨论】:
不幸的是,VirtualBox 地址是我机器上计算机 IP 地址之前的地址。我无法选择真实的 IP 地址,因为两者都有“InterNetwork”标志。【参考方案2】: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()
【讨论】:
System.Net.Dns.GetHostName 是一种方法,而不是属性。 可以得到2个ipv6,0不等于ipv4,可以是另外一组ipv6【参考方案3】: 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;
【讨论】:
【参考方案4】:要查找所有有效的地址列表,这是我使用的代码
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();
【讨论】:
【参考方案5】: 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 并在表单的任何功能中使用。
【讨论】:
【参考方案6】:要查找所有本地 IPv4 地址:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
如果您只想要一个,请使用Array.Find
或Array.FindLast
。
【讨论】:
@NahumLitvin 但这不是 linq? @lukazoid 不是。我的意思可能是 lambda 表达式【参考方案7】:您是否在返回中查看了all the addresses,丢弃了family InterNetworkV6 的那些并只保留了IPv4 的那些?
【讨论】:
我的电话只返回 ipv6,没有 ipv4 条目。如果我在 PowerShell 中执行Resolve-DnsName -Type A
,我会返回 IPv4(在这种情况下它返回的默认类型是 AAAA)。
@subkamran 请将此作为单独的问题,而不是作为评论提出
这是由于我的公司 PC 上的直接访问。无视。
为什么我们不能使用 IPv6?
@StormMuller 因为 OP 询问“获取 IPv4 地址...”以上是关于从 Dns.GetHostEntry() 获取 IPv4 地址的主要内容,如果未能解决你的问题,请参考以下文章
Dns.GetHostAddress和Dns.GetHostEntry都只返回ipv4地址。我如何获得ipv4和ipv6地址?