Heim  >  Artikel  >  Backend-Entwicklung  >  Wie ermittelt man die lokale IP-Adresse und Subnetzmaske in C?

Wie ermittelt man die lokale IP-Adresse und Subnetzmaske in C?

DDD
DDDOriginal
2024-11-10 02:38:02663Durchsuche

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

Abrufen der lokalen IP-Adresse und Subnetzmaske in C

Im Bereich der Netzwerkprogrammierung ist es oft notwendig, die IP-Adresse und das Subnetz zu bestimmen Maske des lokalen Computers. Diese Informationen können für verschiedene Zwecke verwendet werden, beispielsweise zum Versenden von Nachrichten in einem lokalen Netzwerk.

Die Aufgabe, die lokale IP-Adresse und Subnetzmaske abzurufen, mag einfach erscheinen, kann jedoch schwieriger sein, als es zunächst scheint. Bei vielen Computern sind möglicherweise mehrere IP-Adressen verschiedenen Netzwerkschnittstellen zugewiesen. Daher ist es wichtig zu verstehen, welche IP-Adresse für den jeweiligen Netzwerkkontext relevant ist.

In manchen Fällen kann es vorteilhafter sein, die IP-Adresse von dem Remote-Computer anzufordern, mit dem Ihr Programm kommuniziert. Mit diesem Ansatz können Sie die IP-Adresse ermitteln, die von diesem bestimmten Computer angezeigt wird, und so die Relevanz im Kontext der Verbindung sicherstellen.

Unix/Mac-Implementierung

Für Unix und Auf Mac-Systemen ist die Verwendung der Funktion getifaddrs() der empfohlene Ansatz zum Abrufen der Liste aller IP-Adressen, die dem lokalen Computer zugeordnet sind. Hier ist ein Beispiel-Codeausschnitt:

#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-Implementierung

Unter Windows kann die Funktion GetAdaptersAddresses() verwendet werden, um eine ähnliche Funktionalität zu erreichen:

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

Zusätzliche Überlegungen

Beim Umgang mit mehreren Bei IP-Adressen ist es wichtig zu überlegen, welche für Ihre spezifischen Anforderungen geeignet ist. Diese Entscheidung hängt vom Kontext Ihres Programms und der Netzwerkkonfiguration ab. Wenn Sie die Nuancen des lokalen IP-Adressabrufs verstehen, können Sie diese Informationen effektiv für verschiedene Netzwerkanwendungen nutzen.

Das obige ist der detaillierte Inhalt vonWie ermittelt man die lokale IP-Adresse und Subnetzmaske in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn