如何获取本地机器的IPv4和IPv6地址?

4

我正在开发一个Windows应用程序,需要查找本地计算机的IPv4和IPv6地址。操作系统可能是XP或Windows 7。

我已找到获取MAC地址的解决方案,如下:

string GetMACAddress()
{
    var macAddr =
        (
            from nic in NetworkInterface.GetAllNetworkInterfaces()
            where nic.OperationalStatus == OperationalStatus.Up
            select nic.GetPhysicalAddress().ToString()
        ).FirstOrDefault();

    return macAddr.ToString();
}

这在所有操作系统中都有效。

获取在XP和WINDOWS 7上工作的IPv4和IPv6地址的正确方法是什么?

3个回答

8
string strHostName = System.Net.Dns.GetHostName();;
IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
Console.WriteLine(addr[addr.Length-1].ToString());
if (addr[0].AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
            {
                Console.WriteLine(addr[0].ToString()); //ipv6
            }

1
感谢提供宝贵的信息。但是IPv6返回的是::1。有没有办法获取实际值? - Matt
@user970349,它应该返回类似于fe80 :: 9008: 98d4: ffb8: 25d8的东西,这是你的意思吗? - Habib
1
是的。它应该返回类似于fe80::9008:98d4:ffb8:25d8的内容,仍然返回::1。 - Matt
非常感谢。在正确安装IPv6之后,现在它完美地工作了。 - Matt
1
不要忘记,“::1”是“127.0.0.1”的IPv6等效地址。在addr [0]和addr [addr.Length-1]之间可能有其他地址值得检查。 - Jesse Chisholm

2
为了获取所有的IP4和IP6地址,这里是我首选的解决方案。请注意,它还会过滤掉回环IP地址,比如127.0.0.1或::1。
public static IEnumerable<IPAddress> GetIpAddress()
        {
            var host = Dns.GetHostEntry(Dns.GetHostName());
            return (from ip in host.AddressList where !IPAddress.IsLoopback(ip) select ip).ToList();
        }

注意:这需要使用 System.LinqSystem.Collections.Generic 命名空间。 - starbeamrainbowlabs

0
这是我获取所有IPv4地址的方法。
    /// <summary>
    /// Gets/Sets the IPAddress(s) of the computer which the client is running on.
    /// If this isn't set then all IPAddresses which could be enumerated will be sent as
    /// a comma separated list.  
    /// </summary>
    public string IPAddress
    {
        set
        {
            _IPAddress = value;
        }
        get
        {
            string retVal = _IPAddress;

            // If IPAddress isn't explicitly set then we enumerate all IP's on this machine.
            if (_IPAddress == null)
            {
                // TODO: Only return ipaddresses that are for Ethernet Adapters

                String strHostName = Dns.GetHostName();
                IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
                IPAddress[] addr = ipEntry.AddressList;

                List<string> validAddresses = new List<string>();

                // Loops through the addresses and creates a list of valid ones.
                for (int i = 0; i < addr.Length; i++)
                {
                    string currAddr = addr[i].ToString();
                    if( IsValidIP( currAddr ) ) {
                        validAddresses.Add( currAddr );
                    }
                }

                for(int i=0; i<validAddresses.Count; i++)
                {
                    retVal += validAddresses[i];
                    if (i < validAddresses.Count - 1)
                    {
                        retVal += ",";
                    }
                }

                if (String.IsNullOrEmpty(retVal))
                {
                    retVal = String.Empty;
                }

            }

            return retVal;
        }
    }

他需要IPv4和IPv6地址。 - Security Hound
@Ramhound... 是的,这很明确。可以轻松修改以执行IPv6。 - blak3r
2
这就是我为什么要给你的回答点个踩的原因:“这是我获取所有IPv4地址的方法。” 你没有指示如何修改代码以获取IPv6地址。 - Security Hound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接