首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取本地IP地址

获取本地IP地址
EN

Stack Overflow用户
提问于 2011-07-24 04:20:49
回答 26查看 639.2K关注 0票数 351

在互联网上,有几个地方可以告诉你如何获得IP地址。它们中的许多看起来像这个例子:

代码语言:javascript
复制
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#的网络,以及是否要获取局域网IP地址。

EN

回答 26

Stack Overflow用户

回答已采纳

发布于 2011-07-24 04:26:33

获取本地Ip地址的步骤:

代码语言:javascript
复制
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();

票数 513
EN

Stack Overflow用户

发布于 2014-12-09 18:13:34

当本地机器上有多个可用的ip地址时,有一种更准确的方法。Connect一个UDP套接字并读取其本地终结点:

代码语言:javascript
复制
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();
}

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

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

票数 279
EN

Stack Overflow用户

发布于 2014-07-18 05:41:50

我知道这可能是徒劳无功,但也许这能帮助到一些人。我到处寻找找到我的本地IP地址的方法,但我找到的任何地方都写着要使用:

代码语言:javascript
复制
Dns.GetHostEntry(Dns.GetHostName());

我一点也不喜欢这样,因为它只会得到分配给你的计算机的所有地址。如果你有多个网络接口(几乎所有的计算机现在每天都有),你不知道哪个地址对应哪个网络接口。在做了大量研究之后,我创建了一个函数来使用NetworkInterface类并从中提取信息。通过这种方式,我可以知道它是什么类型的接口(以太网、无线、环回、隧道等),它是否处于活动状态,等等。

代码语言:javascript
复制
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地址:

代码语言:javascript
复制
GetLocalIPv4(NetworkInterfaceType.Ethernet);

或您的无线接口:

代码语言:javascript
复制
GetLocalIPv4(NetworkInterfaceType.Wireless80211);

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

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

编辑:

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

代码语言:javascript
复制
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()扩展返回数组中的第一项,如果数组为空,则返回空字符串。

代码语言:javascript
复制
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
票数 132
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6803073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档