Verwendung von die Funktion getaddrinfo in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion getaddrinfo, um den Namen von Host zu IP-Adresse in C zu hosten
  2. Verwendung von die Funktion getnameinfo für die IP-Adresse zum Hostnamen in C
Verwendung von die Funktion getaddrinfo in C

Dieser Artikel zeigt verschiedene Methoden zur Verwendung der Funktion getaddrinfo in C.

Verwenden Sie die Funktion getaddrinfo, um den Namen von Host zu IP-Adresse in C zu hosten

getaddrinfo ist Teil der UNIX-Netzwerkprogrammierfunktionen und kann Netzwerkhostinformationen in die IP-Adresse konvertieren und umgekehrt. getaddrinfo ist auch ein POSIX-kompatibler Funktionsaufruf und kann unabhängig von den zugrunde liegenden Protokollen konvertiert werden.

getaddrinfo akzeptiert vier Argumente:

  1. Der erste kann der Zeiger auf den Hostnamen oder die IPv4 / IPv6-formatierte AdressZeichenkette sein.
  2. Das zweite Argument kann ein Dienstname oder eine Portnummer sein, die mit der Dezimalzahl dargestellt wird.
  3. Die nächsten beiden Argumente sind Zeiger auf addrinfo-Strukturen. Der erste ist hints, die Anforderungen zum Filtern der abgerufenen Socket-Strukturen angeben, während der zweite der Zeiger ist, bei dem die Funktion eine verknüpfte Liste von addrinfo-Strukturen dynamisch zuweist.

Beachten Sie, dass die Struktur hints mit Nullen gesetzt und dann ihre Mitglieder zugewiesen werden sollten. Das Mitglied ai_family gibt die Adressfamilie an, z. B. IPv4 oder IPv6 als AF_INET bzw. AF_INET6. In diesem Fall sind wir nicht an der Konvertierung von Dienstnamen interessiert und geben NULL als zweites Argument für die Funktion an. Schließlich rufen wir getnameinfo auf, um die angegebenen sockaddr-Strukturen in die druckbare Form zu übersetzen.

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>

int main(int argc, char const *argv[]) {
  struct addrinfo hints;
  struct addrinfo *res, *tmp;
  char host[256];

  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;

  if (argc != 2) {
    fprintf(stderr, "%s string\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  int ret = getaddrinfo(argv[1], NULL, &hints, &res);
  if (ret != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
    exit(EXIT_FAILURE);
  }

  for (tmp = res; tmp != NULL; tmp = tmp->ai_next) {
    getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0,
                NI_NUMERICHOST);
    puts(host);
  }

  freeaddrinfo(res);
  exit(EXIT_SUCCESS);
}

Beispielbefehl:

./program localhost

Ausgabe:

127.0.0.1
127.0.0.1
127.0.0.1

Verwendung von die Funktion getnameinfo für die IP-Adresse zum Hostnamen in C

Die Funktion getnameinfo wird in diesem Fall in Verbindung mit getaddrinfo verwendet und ruft die Hostnamen für die entsprechenden IP-Adressen ab. Beachten Sie, dass wir die Benutzereingaben aus dem ersten Befehlszeilenargument verarbeiten und als Argument getaddrinfo übergeben, um die Strukturen socketaddr abzurufen. Schließlich kann jede Struktur in die HostnamenZeichenkette übersetzt werden. Da getaddrinfo im vierten Argument dynamischen Speicher zum Speichern der verknüpften Liste zuweist, sollte dieser Zeiger vom Benutzer mit dem Funktionsaufruf freeaddrinfo freigegeben werden.

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>

int main(int argc, char const *argv[]) {
  struct addrinfo hints;
  struct addrinfo *res, *tmp;
  char host[256];

  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;

  if (argc != 2) {
    fprintf(stderr, "%s string\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  int ret = getaddrinfo(argv[1], NULL, &hints, &res);
  if (ret != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
    exit(EXIT_FAILURE);
  }

  for (tmp = res; tmp != NULL; tmp = tmp->ai_next) {
    getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0, 0);
  }

  freeaddrinfo(res);
  exit(EXIT_SUCCESS);
}

Beispielbefehl:

./program 127.0.0.1

Ausgabe:

localhost
localhost
localhost
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C Networking