Encuentra el nombre de host del sistema en C

Jinku Hu 12 octubre 2023
  1. Utilice la función gethostname para encontrar el nombre de host del sistema en C
  2. Utilice la función uname para encontrar el nombre de host del sistema en C
Encuentra el nombre de host del sistema en C

Este artículo explicará varios métodos para encontrar el nombre de host del sistema en C.

Utilice la función gethostname para encontrar el nombre de host del sistema en C

La función gethostname es parte de la especificación POSIX y se utiliza para acceder al nombre de host del sistema. La función toma dos argumentos: char * apunta a un búfer donde se almacenará el nombre de host recuperado y el número de bytes que denota la longitud del búfer. La función devuelve cero en caso de éxito y -1 se devuelve en caso de error. Tenga en cuenta que es probable que los sistemas POSIX tengan un número máximo de bytes definido para la longitud del nombre de host, por lo que el usuario debe asignar el búfer lo suficientemente grande para almacenar el valor recuperado.

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

Producción :

Hostname:    lenovo-pc

El ejemplo anterior demuestra la llamada básica a la función gethostname, pero siempre se deben implementar rutinas de informes de errores para garantizar un código a prueba de fallas y mensajes de registro informativos. Dado que gethostname establece valores errno, podemos evaluarlo en una declaración switch e imprimir los mensajes correspondientes al flujo 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);
}

Producción :

Hostname:    lenovo-pc

Utilice la función uname para encontrar el nombre de host del sistema en C

Alternativamente, se puede utilizar la llamada a la función uname para encontrar el nombre de host del sistema. uname generalmente puede recuperar varios puntos de datos sobre el sistema, a saber, el nombre del sistema operativo, la fecha de lanzamiento del sistema operativo y la versión, el identificador de hardware y el nombre de host. Sin embargo, tenga en cuenta que uname almacena la información anterior en una estructura utsntheame definida en el archivo de encabezado <sys/utsname.h>. La función lleva el puntero a la estructura utsname y devuelve el valor cero en una llamada exitosa. uname también establece errno en caso de fallo, y el valor de EFAULT se define como una indicación cuando el puntero pasado a una estructura utsname no es válido.

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

Producción :

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

Artículo relacionado - C Networking