Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menentukan Alamat IP Tempatan dan Subnet Mask dalam C?

Bagaimana untuk Menentukan Alamat IP Tempatan dan Subnet Mask dalam C?

DDD
DDDasal
2024-11-10 02:38:02699semak imbas

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

Mendapatkan semula Alamat IP Setempat dan Subnet Mask dalam C

Dalam bidang pengaturcaraan rangkaian, selalunya perlu untuk menentukan alamat IP dan subnet topeng komputer tempatan. Maklumat ini boleh digunakan untuk pelbagai tujuan, seperti menghantar mesej pada rangkaian tempatan.

Tugas mendapatkan semula alamat IP tempatan dan topeng subnet mungkin kelihatan mudah, tetapi ia boleh menjadi lebih rumit daripada yang kelihatan pada mulanya. Banyak komputer mungkin mempunyai berbilang alamat IP yang diberikan kepada antara muka rangkaian yang berbeza. Oleh itu, adalah penting untuk memahami alamat IP yang berkaitan dengan konteks rangkaian tertentu.

Dalam sesetengah kes, lebih berfaedah untuk meminta alamat IP daripada komputer jauh yang program anda berkomunikasi. Pendekatan ini membolehkan anda menentukan alamat IP seperti yang dilihat oleh komputer tertentu itu, memastikan perkaitan dalam konteks sambungan.

Pelaksanaan Unix/Mac

Untuk Unix dan Sistem Mac, menggunakan fungsi getifaddrs() ialah pendekatan yang disyorkan untuk mendapatkan semula senarai semua alamat IP yang dikaitkan dengan mesin tempatan. Berikut ialah contoh coretan kod:

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

Pelaksanaan Windows

Pada Windows, fungsi GetAdaptersAddresses() boleh digunakan untuk mencapai fungsi yang serupa:

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

Pertimbangan Tambahan

Apabila berurusan dengan berbilang alamat IP, adalah penting untuk mempertimbangkan yang mana satu sesuai untuk keperluan khusus anda. Keputusan ini bergantung pada konteks program anda dan konfigurasi rangkaian. Dengan memahami nuansa perolehan semula alamat IP tempatan, anda boleh memanfaatkan maklumat ini dengan berkesan untuk pelbagai aplikasi rangkaian.

Atas ialah kandungan terperinci Bagaimana untuk Menentukan Alamat IP Tempatan dan Subnet Mask dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn