在 C# 中獲取本地 IP 地址

Muhammad Maisam Abbas 2024年2月16日
  1. 使用 C# 中的 Dns.GetHostEntry() 函式獲取本地 IP 地址
  2. 使用 C# 中的 Socket.LocalEndPoint 屬性獲取本地 IP 地址
  3. 在 C# 中使用 Linq 獲取本地 IP 地址
  4. 在 C# 中使用 NetworkInterface 類獲取本地 IP 地址
在 C# 中獲取本地 IP 地址

在本教程中,我們將討論在 C# 中獲取機器本地 IP 地址的方法。

使用 C# 中的 Dns.GetHostEntry() 函式獲取本地 IP 地址

Dns獲取與 Internet 上的主機有關的資訊。在 C# 中,Dns 類中有很多方法可以實現 DNS 相關功能。其中 Dns.GetHostEntry() 函式用於獲取主機的 IP 地址。

以下程式碼示例向我們展示瞭如何使用 C# 中的 Dns.GetHostEntry() 函式獲取計算機的本地 IP 地址。

using System;
using System.Net;

namespace get_local_ip_address {
  class Program {
    static void Main(string[] args) {
      String strHostName = string.Empty;
      IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
      IPAddress[] addr = ipEntry.AddressList;

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

輸出:

IP Address 0: fe80::1db8:23a7:6483:8976%20
IP Address 1: 192.168.43.239

在上面的程式碼中,我們將 Dns.GetHostName() 函式作為 Dns.GetHostEntry() 函式的引數傳遞,以獲取 C# 中本地計算機的 IP 地址。這種方法的唯一問題是,它為我們提供了機器的所有 IP 地址。要獲取特定的 IP 地址,我們必須使用 C# 編寫以下程式碼。

using System;
using System.Net;

namespace get_local_ip_address {
  class Program {
    static void Main(string[] args) {
      var host = Dns.GetHostEntry(Dns.GetHostName());
      foreach (var ip in host.AddressList) {
        if (ip.AddressFamily == AddressFamily.InterNetwork) {
          Console.WriteLine("IP Address = " + ip.ToString());
        }
      }
    }
  }
}

輸出:

IP Address = 192.168.43.239

在上面的程式碼中,我們檢查了 ip.AddressFamily 是否等於 AddressFamily.InterNetwork。此條件檢查 ip 變數中的 IP 地址是否為 IPv4 地址。上面的程式碼僅返回我們計算機的 IPv4 地址。如果要獲取本機的 IPv6 地址,可以使用 AddressFamily.InterNetworkV6 屬性,而不是 AddressFamily.InterNetwork 屬性。

使用 C# 中的 Socket.LocalEndPoint 屬性獲取本地 IP 地址

當有多個 IP 地址時,獲取我們機器的本地 IP 地址的一種更準確的方法是連線 UDP 套接字,然後讀取其本地端點。C# 中的 Socket實現了 Berkeley 套接字介面,該介面提供了網路通訊的功能。以下程式碼示例向我們展示瞭如何使用 Socket.LocalEndPoint 屬性來確定我們的計算機在 C# 中的本地 IP 地址。

using System;
using System.Net;
using System.Net.Sockets;

namespace get_local_ip_address {
  class Program {
    static void Main(string[] args) {
      string localIP = string.Empty;
      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();
      }
      Console.WriteLine("IP Address = " + localIP);
    }
  }
}

輸出:

IP Address = 192.168.43.239

在上面的程式碼中,我們將 socket 套接字連線到我們的本地計算機,並使用 socket.LocalEndPoint 屬性提取了 socket 的本地端點。我們使用 endPoint.Address 屬性來獲取 endPoint 的 IP 地址。

在 C# 中使用 Linq 獲取本地 IP 地址

Linq 或語言整合查詢提供了 C# 中的 SQL 功能。我們還可以使用 Linq 和 Dns.GetHostEntry() 函式在 C# 中獲取我們計算機的本地 IP 地址。

以下程式碼示例向我們展示瞭如何使用 Linq 在 C# 中獲取計算機的本地 IP 地址。

using System;
using System.Linq;
using System.Net;

namespace get_local_ip_address {
  class Program {
    static void Main(string[] args) {
      if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {
        Console.WriteLine("No Network Available");
      }

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

      var ippaddress =
          host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
      Console.WriteLine(ippaddress);
    }
  }
}

輸出:

192.168.43.239

在上面的程式碼中,我們使用 C# 中的 Linq 的 Dns.GetHostEntry() 函式確定了計算機的本地 IPv4 地址。其餘程式碼類似於我們的第一個示例;唯一的區別是,我們從 Dns.GetHostEntry() 函式返回的地址列表中僅提取了一個 IPv4 地址。

在 C# 中使用 NetworkInterface 類獲取本地 IP 地址

NetworkInterface包含有關本地計算機上網路介面的資料並提供網路介面的統計資訊和配置。NetworkInterface 類中的 GetAllNetworkInterfaces() 函式為我們提供了本地計算機上的所有網路介面。使用了 NetworkInterface 類中的 NetworkInterfaceType 屬性獲取網路介面的型別。

以下程式碼示例顯示了我們如何使用所有這些功能來獲取 C# 中本地計算機的本地 IP 地址。

using System;
using System.Linq;
using System.Net;

namespace get_local_ip_address {
  class Program {
    public static void getLocalIPAddressWithNetworkInterface(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();
            }
          }
        }
      }
      Console.WriteLine("IP Address = " + output);
    }
    static void Main(string[] args) {
      getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Wireless80211);
    }
  }
}

輸出:

IP Address = 192.168.43.239

在上面的程式碼中,我們使用 C# 中的 NetworkInterface 類檢索了本地計算機的 WLAN IPv4 地址。上面的程式碼可用於獲取我們本地計算機上的任何型別的 IP 地址。例如,如果要獲取乙太網介面的 IP 地址,則必須在函式呼叫中通過傳遞 NetworkInterfaceType.Ethernet 來指定它。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

相關文章 - Csharp Network