System-Hostname in C finden

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion gethostname, um den System-Hostnamen in C zu finden
  2. Verwendung der Funktion uname zum Ermitteln des System-Hostnamens in C
System-Hostname in C finden

Dieser Artikel erklärt mehrere Methoden, wie man den System-Hostnamen in C finden kann.

Verwenden Sie die Funktion gethostname, um den System-Hostnamen in C zu finden

Die Funktion gethostname ist Teil der POSIX-Spezifikation und wird verwendet, um auf den System-Hostnamen zuzugreifen. Die Funktion nimmt zwei Argumente entgegen: char*, das auf einen Puffer zeigt, in dem der abgefragte Hostname gespeichert wird, und die Anzahl der Bytes, die die Länge des Puffers angibt. Die Funktion gibt bei Erfolg Null zurück, bei einem Fehler wird -1 zurückgegeben. Beachten Sie, dass POSIX-Systeme wahrscheinlich eine maximale Anzahl von Bytes für die Länge des Hostnamens definiert haben, so dass der Benutzer einen Puffer zuweisen sollte, der groß genug ist, um den abgerufenen Wert zu speichern.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

enum { MAX_SIZE = 256 };

int main(void) {
  int ret;
  char hostname[MAX_SIZE];

  ret = gethostname(&hostname[0], MAX_SIZE);
  if (ret == -1) {
    perror("gethostname");
    exit(EXIT_FAILURE);
  }
  printf("Hostname:    %s\n", hostname);

  exit(EXIT_SUCCESS);
}

Ausgabe:

Hostname:    lenovo-pc

Das vorige Beispiel demonstriert den grundlegenden Aufruf der Funktion gethostname, aber man sollte immer Fehlerberichtsroutinen implementieren, um einen ausfallsicheren Code und informative Protokollierungsmeldungen zu gewährleisten. Da die Funktion gethostname errno-Werte setzt, können wir sie in einer switch-Anweisung auswerten und die entsprechenden Meldungen in den stderr-Stream ausgeben.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

enum { MAX_SIZE = 256 };

int main(void) {
  int ret;
  char hostname[MAX_SIZE];

  errno = 0;
  ret = gethostname(&hostname[0], MAX_SIZE);
  if (ret == -1) {
    switch (errno) {
      case EFAULT:
        fprintf(stderr, "'name' argument is an invalid address");
        break;
      case EINVAL:
        fprintf(stderr, "'len' argument is negative");
        break;
      default:
        perror("gethostname");
    }
    exit(EXIT_FAILURE);
  }
  printf("Hostname:    %s\n", hostname);

  exit(EXIT_SUCCESS);
}

Ausgabe:

Hostname:    lenovo-pc

Verwendung der Funktion uname zum Ermitteln des System-Hostnamens in C

Alternativ kann man auch den Funktionsaufruf uname verwenden, um den System-Hostnamen zu finden. uname kann im Allgemeinen mehrere Datenpunkte über das System abrufen, nämlich den Betriebssystemnamen, das Veröffentlichungsdatum und die Version des Betriebssystems, die Hardware-Kennung und den Hostnamen. Beachten Sie jedoch, dass uname die oben genannten Informationen in einer utsntheame-Struktur speichert, die in der Header-Datei <sys/utsname.h> definiert ist. Die Funktion nimmt den Zeiger auf die utsname-Struktur und gibt bei einem erfolgreichen Aufruf den Wert Null zurück. Außerdem setzt uname im Fehlerfall errno, und der Wert EFAULT ist als Hinweis definiert, wenn der übergebene Zeiger auf eine utsname-Struktur ungültig ist.

#include <stdio.h>
#include <stdlib.h>
#include <sys/utsname.h>

enum { MAX_SIZE = 256 };

int main(void) {
  struct utsname uts;

  if (uname(&uts) == -1) perror("uname");

  printf("Node name:   %s\n", uts.nodename);
  printf("System name: %s\n", uts.sysname);
  printf("Release:     %s\n", uts.release);
  printf("Version:     %s\n", uts.version);
  printf("Machine:     %s\n", uts.machine);

  exit(EXIT_SUCCESS);
}

Ausgabe:

Hostname:    lenovo-pc
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