获取本地IP地址


301

在互联网上,有几个地方向您展示如何获取IP地址。其中很多看起来像这个例子:

String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
{
    Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();

在此示例中,我获得了几个IP地址,但是我只想获得路由器分配给运行该程序的计算机的IP地址:如果某人希望访问我计算机中的共享文件夹以获取该IP,实例。

如果我没有连接到网络,而是通过没有路由器的调制解调器直接连接到了互联网,那么我想得到一个错误。如何查看我的计算机是否已使用C#连接到网络,以及如何获取LAN IP地址。


If I am not connected to a network and I am connected to the internet 这种说法似乎是矛盾的。您是否要确定您的计算机是连接到专用LAN还是Internet?
安迪

4
就像警告一样:一台计算机可以具有多个IP接口,例如LAN和WiFi。如果将服务绑定到特定的硬件(例如LAN),则需要LAN的IP。以下大多数示例将返回找到的“第一个”或“最后一个” IP地址。如果您拥有2个以上的IP地址,则程序可能会在50%的时间内运行,这取决于操作系统返回IP地址的随机顺序。
Mark Lakata 2014年

@MarkLakata我想到了同样的问题。我在下面的答案中的功能将对其进行处理。您可以指定想要IP地址的网络接口类型。
compman2408 2014年

3
只是FTR,如果您在此处搜索Unity3D,则是其API中的Network.player.ipAddress
Fattie 2014年

@MarkLakata严格来说,“第一个”或“最后一个” IP “正确的” IP,因为浏览器可以使用任何可用的IP。可能的一个很好的纠正方法是返回与机器关联的每个 IP。
UncaAlby

Answers:


457

要获取本地IP地址:

public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    throw new Exception("No network adapters with an IPv4 address in the system!");
}

要检查您是否已连接:

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();


29
如果你使用的东西像VM虚拟框,genymotion等将无法正常工作
PauLEffect

5
同意PaulEffect。这种方法不仅对多个网卡不利,而且对IP v6和IP v4地址也没有区别。
最多

16
@John AddressFamily.InterNetwork是IP v4,而AddressFamily.InterNetworkV6是IP v6
Leonardo Xavier

我正在使用Geraldo H答案,但是如果有人在使用它,则您可能希望删除所有以1结尾的ip,因此它将删除回送和virtualbox / vmware默认ip
Leonardo Xavier

6
看来您正在使用VMWare或其他虚拟化软件。OP并没有要求这样做,因此我认为由于这个原因,投下反对票有些苛刻。如果您有VMWare或多个NIC,则其他一些答案已经提供了线索。
彻奇

218

当本地计算机上有多个IP地址可用时,有一种更准确的方法。ConnectUDP套接字并读取其本地端点:

string localIP;
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();
}

Connect在UDP套接字上具有以下效果:它为Send/ 设置目标Recv,丢弃其他地址中的所有数据包,并且-这就是我们所使用的-将套接字转换为“已连接”状态,并设置其适当的字段。这包括根据系统的路由表检查到目的地的路由是否存在,并相应地设置本地端点。最后一部分似乎没有正式记录,但看起来像Berkeley套接字API的一个固有特征(UDP“已连接”状态的副作用)可以在Windows 和Linux上可靠地运行各个版本和发行版中。

因此,此方法将提供用于连接到指定远程主机的本地地址。没有建立真正的连接,因此指定的远程IP可能无法访问。


4
这是满足我需求的最佳解决方案。在我的情况下,我有许多网卡和一些无线连接。我需要根据激活的连接获取首选的IP地址。
大卫

10
没有网络连接-无论如何您都没有IP地址。因此,该代码仍然保持有效,尽管谨慎地添加try..catch来处理这种情况,如果抛出SocketException,则返回类似“ 127.0.0.1”的内容。
拉斯

2
@PatrickSteele,是的,它返回特定目标的首选出站IP地址。如果您想获取您的局域网IP地址,请尝试指出目标是您局域网中的某个IP
隔壁的王先生(Mr. Door)

2
此方法在具有dotnet核心的mac上有效,而当前接受的答案无效。
Pellet

9
该解决方案的运行速度比接受的答案(Mrchief的)快4倍。这应该是真正的答案
Kamarey

115

重构Mrcheif的代码以利用Linq(即.Net 3.0+)。。

private IPAddress LocalIPAddress()
{
    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
    {
        return null;
    }

    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());

    return host
        .AddressList
        .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
}

:)


我有一些IP地址,称为“ Inter Network”,该解决方案实际上可以正常工作,并提供正确的IP地址。Mrchief的另一个给了我最后一个。所以实际上这应该是正确的;)
Keenora Fluffball 2011年

26
@KeenoraFluffball-这个给您第一个,而这个给您最后一个(反之亦然,取决于列表的构造方式)。无论哪种方式,都不对-如果给您分配了多个IP地址,则需要知道您使用的是哪个网络。猜测第一个或最后一个不是正确的解决方案。
gbjbaanb 2013年

可能还想包括AddressFamily.InterNetworkV6
joelsand

如果您还必须处理独立PC,则在网络不可用的情况下返回null无效。我将其替换为“ return IPAddress.Loopback;”。对应于特殊IP号码127.0.0.1。
基督教徒

109

我知道这可能会踢死人,但这也许可以帮助某人。我到处寻找可以找到我本地IP地址的方法,但是在我发现它可以使用的任何地方:

Dns.GetHostEntry(Dns.GetHostName());

我根本不喜欢这样,因为它只是获取分配给您计算机的所有地址。如果您有多个网络接口(如今几乎所有计算机都使用该接口),则您不知道哪个地址与哪个网络接口一起使用。经过大量研究后,我创建了一个使用NetworkInterface类的函数,并从中提取信息。通过这种方式,我可以分辨出它是什么类型的接口(以太网,无线,环回,隧道等),它是否处于活动状态以及SOOO等等。

public string GetLocalIPv4(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();
                }
            }
        }
    }
    return output;
}

现在获取您的以太网接口调用的IPv4地址:

GetLocalIPv4(NetworkInterfaceType.Ethernet);

或您的无线接口:

GetLocalIPv4(NetworkInterfaceType.Wireless80211);

如果您尝试获取无线接口的IPv4地址,但是您的计算机没有安装无线网卡,它将仅返回一个空字符串。以太网接口也是一样。

希望这对某人有帮助!:-)

编辑:

有人指出(感谢@NasBanov),尽管此功能将以比使用Dns.GetHostEntry(Dns.GetHostName())它更好的方式提取IP地址,但在支持相同类型的多个接口或单个接口上的多个IP地址方面效果不佳。当可能分配了多个地址时,它只会返回一个IP地址。要返回所有这些分配的地址,您可以简单地操纵原始函数以始终返回数组而不是单个字符串。例如:

public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
    List<string> ipAddrList = new List<string>();
    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)
                {
                    ipAddrList.Add(ip.Address.ToString());
                }
            }
        }
    }
    return ipAddrList.ToArray();
}

现在,此函数将返回特定接口类型的所有分配地址。现在只获取一个字符串,您可以使用.FirstOrDefault()扩展名返回数组中的第一项,如果为空,则返回一个空字符串。

GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();

5
这是一个更好的解决方案,因为在许多地方都没有DNS可用性,并且接口可以具有多个IP地址。我也利用类似的方法。
MertGülsoy2014年

问题是每个接口只返回1个IP地址...最后一个IP,foreach。
Nas Banov

@ compman2408-不是,单个接口可以具有多个IP,有关所有组合,请参见en.wikipedia.org/wiki/Multihoming#Variants。一个明显的例子是同时运行IPv4和IPv6,但是过去我只有一个以太网适配器参与多个IPv4网络。也许不寻常-完全合法。例如,适用于Windows见windowsnetworking.com/articles-tutorials/windows-2003/...
纳斯Banov

@NasBanov此功能仅用于获取IPv4地址,因此我什至不讨论IPv6及其当前的无用性。我知道多宿主是连接到多个接口上的多个网络,但是从未听说过连接到同一接口上的多个网络。即使您似乎确实是有可能的,但以这种方式使用NIC的人中,不到1%的人只需要更改函数即可返回数组。
compman2408

1
这次真是万分感谢。仅供参考,至少在OSX的.NET 3.5 mono上item.OperationalStatus始终返回Unknown
gman

36

这是为我工作的修改后的版本(来自compman2408的版本):

    internal static string GetLocalIPv4(NetworkInterfaceType _type)
    {  // Checks your IP adress from the local network connected to a gateway. This to avoid issues with double network cards
        string output = "";  // default output
        foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) // Iterate over each network interface
        {  // Find the network interface which has been provided in the arguments, break the loop if found
            if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
            {   // Fetch the properties of this adapter
                IPInterfaceProperties adapterProperties = item.GetIPProperties();
                // Check if the gateway adress exist, if not its most likley a virtual network or smth
                if (adapterProperties.GatewayAddresses.FirstOrDefault() != null)
                {   // Iterate over each available unicast adresses
                    foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses)
                    {   // If the IP is a local IPv4 adress
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {   // we got a match!
                            output = ip.Address.ToString();
                            break;  // break the loop!!
                        }
                    }
                }
            }
            // Check if we got a result if so break this method
            if (output != "") { break; }
        }
        // Return results
        return output;
    }

您可以调用此方法,例如:

GetLocalIPv4(NetworkInterfaceType.Ethernet);

更改:我正在从分配了网关IP的适配器中检索IP。第二个变化:我添加了文档字符串和break语句以使此方法更有效。


2
聪明的解决方案。我现在正在用这个。
RQDQ

4
具有与源代码相同的问题:它仅返回IP之一,是许多IP中的随机IP,而不必是您所需要的IP。它赢得了ademiller.com/blogs/tech/2008/06/it-works-on-my-machine-award
Nas Banov

1
@NasBanov,确定我确实赚了,正如我在帖子中所说:“对我有用”。:-)
Gerardo H

这是要走的路,谢谢你。如果安装了用于仿真器的环回开关,则其他所有变体均会失败,而该变体却会成功!
DiamondDrake

1
为什么只返回找到的最后一个IP地址,而不返回第一个?break最内在if或简单的simpel return可以解决问题。
Martin Mulder

20

这是我找到的获取当前IP的最佳代码,避免获取VMWare主机或其他无效IP地址。

public string GetLocalIpAddress()
{
    UnicastIPAddressInformation mostSuitableIp = null;

    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

    foreach (var network in networkInterfaces)
    {
        if (network.OperationalStatus != OperationalStatus.Up)
            continue;

        var properties = network.GetIPProperties();

        if (properties.GatewayAddresses.Count == 0)
            continue;

        foreach (var address in properties.UnicastAddresses)
        {
            if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                continue;

            if (IPAddress.IsLoopback(address.Address))
                continue;

            if (!address.IsDnsEligible)
            {
                if (mostSuitableIp == null)
                    mostSuitableIp = address;
                continue;
            }

            // The best IP is the IP got from DHCP server
            if (address.PrefixOrigin != PrefixOrigin.Dhcp)
            {
                if (mostSuitableIp == null || !mostSuitableIp.IsDnsEligible)
                    mostSuitableIp = address;
                continue;
            }

            return address.Address.ToString();
        }
    }

    return mostSuitableIp != null 
        ? mostSuitableIp.Address.ToString()
        : "";
}

您可能应该解释一下,为什么这段代码是答案的解决方案。如果您已连接到互联网,您是否能真正获得关于该问题的答案,这是否会导致错误?
Philipp M

其他方式不使用IsDnsEligible和PrefixOrigin验证。
rodcesar.santos '16

@PhilippM如果地址不是DNS合格的,则它是保留的内部IP。它不是互联网提供商的主机。如果DHCP服务器提供了PrefixOrigin,则可能是最佳的地址选择。这是对我有用的独特功能!
rodcesar.santos '16

1
@ user1551843-太好了,谢谢。我使用的是旧的折旧的GetHostByName方法,但它返回的是VMWare适配器的IP :)
Jason Newland

这是唯一适用于vpn +无线的解决方案。谢谢。
jay-danger

12

我认为使用LinQ更容易:

Dns.GetHostEntry(Dns.GetHostName())
   .AddressList
   .First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
   .ToString()

14
那不是LINQ,那是扩展方法和lambda。有区别。
2014年

10
@Mark-如果不添加“ using System.Linq;” 您仍然不能使用“ First”扩展方法
BornToCode 2015年

5
这是因为扩展方法在System.Linq命名空间的Enumerable类中。仍然不是LINQ。
2015年

20
标记,即使是简短形式,该语句的确使用了以method(lambda)语法呈现的LINQ-to-objects。查询语法只是语法糖,它被编译为IEnumerable扩展方法调用链,这就是LINQ-to-objects。资料来源:编写了LINQ-to-SQL提供程序和有关该主题的一系列文章。
君士坦丁克


9

笑了一下,以为我会尝试使用新的C#6空条件运算符来获取一条LINQ语句。看起来很疯狂,可能效率很低,但是可以用。

private string GetLocalIPv4(NetworkInterfaceType type = NetworkInterfaceType.Ethernet)
{
    // Bastardized from: http://stackoverflow.com/a/28621250/2685650.

    return NetworkInterface
        .GetAllNetworkInterfaces()
        .FirstOrDefault(ni =>
            ni.NetworkInterfaceType == type
            && ni.OperationalStatus == OperationalStatus.Up
            && ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null
            && ni.GetIPProperties().UnicastAddresses.FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) != null
        )
        ?.GetIPProperties()
        .UnicastAddresses
        .FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork)
        ?.Address
        ?.ToString()
        ?? string.Empty;
}

逻辑由Gerardo H(并通过引用compman2408)提供。


绝对有趣(+1),但实际上根本不需要效率低下。让我想起了使用LISP或Forth编程的方法:-)
Roland

6

使用linq表达式获取IP的其他方法:

public static List<string> GetAllLocalIPv4(NetworkInterfaceType type)
{
    return NetworkInterface.GetAllNetworkInterfaces()
                   .Where(x => x.NetworkInterfaceType == type && x.OperationalStatus == OperationalStatus.Up)
                   .SelectMany(x => x.GetIPProperties().UnicastAddresses)
                   .Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork)
                   .Select(x => x.Address.ToString())
                   .ToList();
}

5

@mrcheif我今天找到了这个答案,尽管它确实返回了错误的IP(不是由于代码不起作用),但它非常有用,但是当您运行Himachi之类的东西时,它给出了错误的互联网IP。

public static string localIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    host = Dns.GetHostEntry(Dns.GetHostName());

    foreach (IPAddress ip in host.AddressList)
    {
        localIP = ip.ToString();

        string[] temp = localIP.Split('.');

        if (ip.AddressFamily == AddressFamily.InterNetwork && temp[0] == "192")
        {
            break;
        }
        else
        {
            localIP = null;
        }
    }

    return localIP;
}

2
您是说Logmein Hamachi吗?这是一个VPN解决方案,它会修补网络堆栈。另外,作为VPN,在连接时返回VPN分配的IP是合理的(这只是我的猜测)。
Mrchief 2013年

2
完全不可靠。192.0.0.0/8对于私有IP地址(存在3个范围,均与此范围不同)而言,这不仅不是正确的测试,而且很可能是公司网络范围,因此“本地”范围不是很多。
ivan_pozdeev

5

经过一个或多个LAN卡和虚拟机测试

public static string DisplayIPAddresses()
    {
        string returnAddress = String.Empty;

        // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface network in networkInterfaces)
        {
            // Read the IP configuration for each network
            IPInterfaceProperties properties = network.GetIPProperties();

            if (network.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
                   network.OperationalStatus == OperationalStatus.Up &&
                   !network.Description.ToLower().Contains("virtual") &&
                   !network.Description.ToLower().Contains("pseudo"))
            {
                // Each network interface may have multiple IP addresses
                foreach (IPAddressInformation address in properties.UnicastAddresses)
                {
                    // We're only interested in IPv4 addresses for now
                    if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                        continue;

                    // Ignore loopback addresses (e.g., 127.0.0.1)
                    if (IPAddress.IsLoopback(address.Address))
                        continue;

                    returnAddress = address.Address.ToString();
                    Console.WriteLine(address.Address.ToString() + " (" + network.Name + " - " + network.Description + ")");
                }
            }
        }

       return returnAddress;
    }

请记住,这仅适用于以太网。删除NetworkInterfaceType限制以支持wi-fi。
scor4er

3

只是使用LINQ的我的更新版本:

/// <summary>
/// Gets the local Ipv4.
/// </summary>
/// <returns>The local Ipv4.</returns>
/// <param name="networkInterfaceType">Network interface type.</param>
IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType)
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType == networkInterfaceType && i.OperationalStatus == OperationalStatus.Up);

    foreach (var networkInterface in networkInterfaces)
    {
        var adapterProperties = networkInterface.GetIPProperties();

        if (adapterProperties.GatewayAddresses.FirstOrDefault() == null)
                continue;
        foreach (var ip in networkInterface.GetIPProperties().UnicastAddresses)
        {
            if (ip.Address.AddressFamily != AddressFamily.InterNetwork)
                    continue;

            return ip.Address;
        }
    }

    return null;
}

2

先决条件:您必须添加System.Data.Linq引用并对其进行引用

using System.Linq;
string ipAddress ="";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork));

2

我也在努力获取正确的IP。

我在这里尝试了多种解决方案,但是都没有给我带来想要的效果。几乎所有提供的条件测试都导致没有地址被使用。

这对我有用,希望对您有所帮助...

var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address)
                    where !IPAddress.IsLoopback(address) && address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                    select address).FirstOrDefault();

Console.WriteLine(firstAddress);


1

请记住,在一般情况下,您可能会进行多个NAT转换,并且可能有多个dns服务器,每个服务器在不同的NAT转换级别上运行。

如果您拥有运营商级NAT,并希望与同一运营商的其他客户通信,该怎么办?在一般情况下,您永远无法确定,因为在每次NAT转换时,主机名可能会不同。


1

过时了,这对我有用

public static IPAddress GetIPAddress()
{ 
 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => 
 address.AddressFamily == AddressFamily.InterNetwork).First();
 return ip;
}

1

通过Linq更新Mrchief的答案,我们将有:

public static IPAddress GetLocalIPAddress()
{
   var host = Dns.GetHostEntry(Dns.GetHostName());
   var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
   return ipAddress;
}

1

这将从具有两个单独列表IPV4和IPV6的网关地址和单播地址的任何接口返回地址。

public static (List<IPAddress> V4, List<IPAddress> V6) GetLocal()
{
    List<IPAddress> foundV4 = new List<IPAddress>();
    List<IPAddress> foundV6 = new List<IPAddress>();

    NetworkInterface.GetAllNetworkInterfaces().ToList().ForEach(ni =>
    {
        if (ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null)
        {
            ni.GetIPProperties().UnicastAddresses.ToList().ForEach(ua =>
            {
                if (ua.Address.AddressFamily == AddressFamily.InterNetwork) foundV4.Add(ua.Address);
                if (ua.Address.AddressFamily == AddressFamily.InterNetworkV6) foundV6.Add(ua.Address);
            });
        }
    });

    return (foundV4.Distinct().ToList(), foundV6.Distinct().ToList());
}

整洁的解决方案:)
JohanFranzén19年

1

已经有很多答案了,但是我仍然在贡献我的一个:

public static IPAddress LocalIpAddress() {
    Func<IPAddress, bool> localIpPredicate = ip =>
        ip.AddressFamily == AddressFamily.InterNetwork &&
        ip.ToString().StartsWith("192.168"); //check only for 16-bit block
    return Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(localIpPredicate);
}

一班轮:

public static IPAddress LocalIpAddress() => Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork && ip.ToString().StartsWith("192.168"));

注意:请从最后搜索,因为在将某些接口添加到设备后,例如MobileHotspot,VPN或其他精美的虚拟适配器,它仍然可以工作。


1
所以,如果我的本地IP是10.0.2.3,找不到它吗?这段代码真的很奇怪。
frankhommers,

有人说@frankhommers 仅检查16位块
-nyconing

16位块也可以是192.168
之外的

0

另外,还有用于获取客户端IP的简单代码:

        public static string getclientIP()
        {
            var HostIP = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
            return HostIP;
        }

希望对您有帮助。



0

修改了compman2408的代码,以便可以遍历每个代码NetworkInterfaceType

public static string GetLocalIPv4 (NetworkInterfaceType _type) {
    string output = null;
    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 ();
                }
            }
        }
    }
    return output;
}

您可以这样称呼它:

static void Main (string[] args) {
    // Get all possible enum values:
    var nitVals = Enum.GetValues (typeof (NetworkInterfaceType)).Cast<NetworkInterfaceType> ();

    foreach (var nitVal in nitVals) {
        Console.WriteLine ($"{nitVal} => {GetLocalIPv4 (nitVal) ?? "NULL"}");
    }
}

0
Imports System.Net
Imports System.Net.Sockets
Function LocalIP()
    Dim strHostName = Dns.GetHostName
    Dim Host = Dns.GetHostEntry(strHostName)
    For Each ip In Host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            txtIP.Text = ip.ToString
        End If
    Next

    Return True
End Function

低于同一动作

函数LocalIP()

昏暗的主机作为字符串= Dns.GetHostEntry(Dns.GetHostName).AddressList(1).MapToIPv4.ToString

txtIP.Text =主机

返回真

结束功能


下面的示例是相同的操作函数LocalIP()Dim Host As String = Dns.GetHostEntry(Dns.GetHostName).AddressList(1).MapToIPv4.ToString txtIP.Text = Host Return True End Function
YongJae Kim

-2
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1]

一行代码:D


7
在某些情况下,它可能会抛出OutOfRangeException。
Loudenvier 2014年

5
另外,您怎么知道想要哪一个?对您来说正确的事对别人可能是错的。
标记

-3

如果您有虚拟机或额外的网卡,则地址列表中可能还有其他值。我的建议是检查地址列表中的条目并进行适当打印。在我的情况下,条目3是我的机器的ipv4地址

IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[3];
string ip = ipAddr.ToString();

不要忘记添加 using System.Net;


1
更正; 所有这些都是您计算机的IP地址。但是,您想要的是另外一回事。请注意,顺序可以更改,并且由于您使用的方法,您总是会猜测。
2014年

那就是我所说的,您应该检查地址列表的条目,是的,这是猜测,但是在看到所有条目之后,猜测并不难
Bibaswann Bandyopadhyay 2014年

您怎么知道哪个合适?使用compman2048的解决方案,您至少会知道哪个绑定到哪个接口。
2014年

该解决方案在我的计算机上不起作用,因为我有2个wlan接口,2个虚拟机和1个仿真器,所以我有很多IP。但是,如果您要查找路由器提供的内部地址,它将以192或172或10开头,这就是我的理解
Bibaswann Bandyopadhyay 2014年

除非您的路由器分发公共IP,否则这种情况不常见,但有可能。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.