Trovare l'hostname del sistema in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione gethostname per trovare l’hostname di sistema in C
  2. Usa la funzione uname per trovare l’hostname del sistema in C
Trovare l'hostname del sistema in C

Questo articolo spiegherà diversi metodi per trovare l’hostname di sistema in C.

Usa la funzione gethostname per trovare l’hostname di sistema in C

La funzione gethostname fa parte della specifica POSIX ed è usata per accedere al nome host del sistema. La funzione accetta due argomenti: char* che punta a un buffer in cui verrà memorizzato il nome host recuperato e il numero di byte che indica la lunghezza del buffer. La funzione restituisce zero in caso di successo e -1 viene restituito in caso di errore. Si noti che è probabile che i sistemi POSIX abbiano un numero massimo di byte definito per la lunghezza del nome host, quindi l’utente deve allocare un buffer sufficientemente grande per memorizzare il valore recuperato.

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

Produzione:

Hostname:    lenovo-pc

L’esempio precedente mostra la chiamata di base alla funzione gethostname, ma si dovrebbero sempre implementare routine di segnalazione degli errori per garantire codice a prova di errore e messaggi di registrazione informativi. Poiché gethostname imposta i valori errno, possiamo valutarlo in un’istruzione switch e stampare i messaggi corrispondenti nel flusso stderr.

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

Produzione:

Hostname:    lenovo-pc

Usa la funzione uname per trovare l’hostname del sistema in C

In alternativa, si può utilizzare la chiamata alla funzione uname per trovare il nome host del sistema. uname può generalmente recuperare diversi punti dati sul sistema, vale a dire il nome del sistema operativo, la data di rilascio del sistema operativo e la versione, l’identificatore hardware e il nome host. Si noti, tuttavia, che uname memorizza le informazioni di cui sopra in una struttura utsntheame definita nel file di intestazione <sys/utsname.h>. La funzione porta il puntatore alla struttura utsname e restituisce il valore zero in caso di chiamata riuscita. uname imposta anche errno in caso di fallimento, e il valore EFAULT è definito come un’indicazione quando il puntatore passato a una struttura utsname non è valido.

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

Produzione:

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

Articolo correlato - C Networking