获取本地IP地址

在互联网上有几个地方告诉你如何获得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地址,如果他希望访问我的计算机中的共享文件夹实例。

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


获取本地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();


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

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

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

所以,这个方法会给出用来连接到指定远程主机的本地地址。 没有建立真正的连接,因此指定的远程IP可能无法访问。


重构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);
}

:)

链接地址: http://www.djcxy.com/p/36071.html

上一篇: Get local IP address

下一篇: checking logic occur in MSIL or machine code