Verwendung von die Funktion getaddrinfo in C
-
Verwenden Sie die Funktion
getaddrinfo
, um den Namen von Host zu IP-Adresse in C zu hosten -
Verwendung von die Funktion
getnameinfo
für die IP-Adresse zum Hostnamen 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:
- Der erste kann der Zeiger auf den Hostnamen oder die IPv4 / IPv6-formatierte AdressZeichenkette sein.
- Das zweite Argument kann ein Dienstname oder eine Portnummer sein, die mit der Dezimalzahl dargestellt wird.
- Die nächsten beiden Argumente sind Zeiger auf
addrinfo
-Strukturen. Der erste isthints
, die Anforderungen zum Filtern der abgerufenen Socket-Strukturen angeben, während der zweite der Zeiger ist, bei dem die Funktion eine verknüpfte Liste vonaddrinfo
-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
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