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
getnameinfofü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