首頁 >後端開發 >C++ >如何在C語言中確定本地IP位址和子網路遮罩?

如何在C語言中確定本地IP位址和子網路遮罩?

DDD
DDD原創
2024-11-10 02:38:02697瀏覽

How to Determine the Local IP Address and Subnet Mask in C  ?

用C 語言檢索本地IP 位址和子網路遮罩

在網路程式設計領域,經常需要確定IP 位址和子網路本地電腦的掩碼。此資訊可用於多種目的,例如在本地網路上發送訊息。

檢索本地 IP 位址和子網路遮罩的任務可能看起來很簡單,但它可能比最初看起來要棘手。許多電腦可能有多個分配給不同網路介面的 IP 位址。因此,了解哪個 IP 位址與特定網路上下文相關非常重要。

在某些情況下,從程式正在與之通訊的遠端電腦請求 IP 位址可能會更有益。這種方法可讓您確定該特定電腦所看到的 IP 位址,確保連線上下文中的相關性。

Unix/Mac 實作

對於 Unix 和Mac 系統中,建議使用 getifaddrs() 函數來擷取所有與本機電腦關聯的 IP 位址的清單。以下是一個範例程式碼片段:

#include <ifaddrs.h>

void GetNetworkInterfaceInfos() {
  struct ifaddrs *ifaddr;
  int status = getifaddrs(&ifaddr);
  if (status != 0) {
    // Error handling
  }

  for (struct ifaddrs *ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr == NULL) {
      continue;
    }
    if (ifa->ifa_addr->sa_family == AF_INET) { // IPv4 address
      struct sockaddr_in *in = (struct sockaddr_in *)ifa->ifa_addr;
      printf("IP address: %s\n", inet_ntoa(in->sin_addr));

      // Get subnet mask if available
      if (ifa->ifa_netmask != NULL) {
        struct sockaddr_in *mask = (struct sockaddr_in *)ifa->ifa_netmask;
        printf("Subnet mask: %s\n", inet_ntoa(mask->sin_addr));
      }
    } else if (ifa->ifa_addr->sa_family == AF_INET6) { // IPv6 address
      // Handle IPv6 addresses here
    }
  }

  freeifaddrs(ifaddr);
}

Windows 實作

在Windows 上,可以使用GetAdaptersAddresses() 函數來實作類似的功能:

#include <iphlpapi.h>

void GetNetworkInterfaceInfos() {
  PIP_ADAPTER_ADDRESSES adapter_addresses;
  ULONG size = 0;
  GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapter_addresses, &size);
  adapter_addresses = (PIP_ADAPTER_ADDRESSES)HeapAlloc(GetProcessHeap(), 0, size);
  GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapter_addresses, &size);

  for (PIP_ADAPTER_ADDRESSES adapter = adapter_addresses; adapter; adapter = adapter->Next) {
    printf("IP address: %s\n", adapter->IpAddressList.IpAddress.String);

    // Get subnet mask if available
    if (adapter->SubnetMaskList.IpAddress.String) {
      printf("Subnet mask: %s\n", adapter->SubnetMaskList.IpAddress.String);
    }
  }

  HeapFree(GetProcessHeap(), 0, adapter_addresses);
}

其他注意事項

處理多個 IP 位址時,必須考慮哪一個適合您的特定要求。此決定將取決於您的程式的上下文和網路配置。透過了解本機 IP 位址檢索的細微差別,您可以有效地將這些資訊用於各種網路應用程式。

以上是如何在C語言中確定本地IP位址和子網路遮罩?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn