¿Cómo obtengo las direcciones IP de mi host desde un programa C?

1 minuto de lectura

¿Como obtengo las direcciones IP de mi host desde un
Emanuel

Necesito mostrar todas las direcciones IP de mi computadora local, usando el lenguaje C. ¿Cómo se puede hacer esto?

  • puts("127.0.0.1"); Es una broma 🙂

    – pmg

    7 de enero de 2010 a las 15:50


  • ¿De qué direcciones IP? ¿Las direcciones IP que tiene asignada la computadora? ¿Las direcciones IP en su red? Además, ¿en qué plataforma estás trabajando? El lenguaje C en sí mismo no sabe nada sobre IP. Tendría que hacer llamadas al sistema operativo, y esas pueden diferir entre sistemas operativos.

    –David Thornley

    7 de enero de 2010 a las 15:54

  • Está etiquetado como “linux”

    luego

    7 de enero de 2010 a las 15:55

  • int i, j, k, l; para(i=0;i<256;++i) { para(j=0;j<256;++j) { para(k=0;k<256;++k) { para(l=0 ;l<256;++l) { printf("\n%d.%d.%d.%d",i,j,k,l); } } } } :)

    – jacob

    7 de enero de 2010 a las 15:56


  • @Jacob: dijo todas las direcciones IP, no todas las direcciones IPv4 😉

    –Steve Jessop

    7 de enero de 2010 a las 18:39

#include <stdio.h>
#include <stropts.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/netdevice.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

int print_addresses(const int domain)
{
  int s;
  struct ifconf ifconf;
  struct ifreq ifr[50];
  int ifs;
  int i;

  s = socket(domain, SOCK_STREAM, 0);
  if (s < 0) {
    perror("socket");
    return 0;
  }

  ifconf.ifc_buf = (char *) ifr;
  ifconf.ifc_len = sizeof ifr;

  if (ioctl(s, SIOCGIFCONF, &ifconf) == -1) {
    perror("ioctl");
    return 0;
  }

  ifs = ifconf.ifc_len / sizeof(ifr[0]);
  printf("interfaces = %d:\n", ifs);
  for (i = 0; i < ifs; i++) {
    char ip[INET_ADDRSTRLEN];
    struct sockaddr_in *s_in = (struct sockaddr_in *) &ifr[i].ifr_addr;

    if (!inet_ntop(domain, &s_in->sin_addr, ip, sizeof(ip))) {
      perror("inet_ntop");
      return 0;
    }

    printf("%s - %s\n", ifr[i].ifr_name, ip);
  }

  close(s);

  return 1;
}

int main(int argc, char *argv[])
{
  int domains[] = { AF_INET, AF_INET6 };
  int i;

  for (i = 0; i < sizeof(domains) / sizeof(domains[0]); i++)
    if (!print_addresses(domains[i]))
      return 1;

  return 0;
}

  • Además de comparar todas las direcciones IP con la dirección IP de la puerta de enlace predeterminada, ¿cuál es la mejor manera de averiguar qué interfaz es “predeterminada” para la conexión a Internet?

    – margarita

    8 mayo 2012 a las 11:40

  • @ warl0ck Eso puede ser complicado de hacer en el caso general. La suya sería interesante como una pregunta independiente de Stack Overflow.

    –Greg Bacon

    9 mayo 2012 a las 21:12

1647679513 877 ¿Como obtengo las direcciones IP de mi host desde un
Pato

Tu pregunta puede ser imprecisa, pero no estoy seguro de por qué todos te rompen las manos.

Creo que estás preguntando lo básico, en cuyo caso probablemente quieras getifaddrs. La página del manual tiene un pequeño programa de ejemplo.

También puede obtener información similar usando la opción SIOCGIFCONF con ioctl(). Hay un código de muestra aquí y en la web.

Si busca estos y otros términos similares, encontrará que esta pregunta se ha formulado anteriormente de varias formas. Tienes que cavar un poco.

También tenga en cuenta que estos no le darán la IP pública de su red si está detrás de NAT.

Otra forma de hacerlo en C. Sin embargo, tengo que decir… hay tantas formas de hacerlo desde el shell, ¿cuál es el punto?

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>

#include <errno.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>


void show_address_info( struct ifaddrs *ifa ){
  struct sockaddr_in *s4;
  struct sockaddr_in6 *s6;
  /* ipv6 addresses have to fit in this buffer */
  char buf[64];

  if (AF_INET == ifa->ifa_addr->sa_family){
    s4 = (struct sockaddr_in *)(ifa->ifa_addr);
    if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s4->sin_addr), buf, sizeof(buf))){
      printf("%s: inet_ntop failed!\n", ifa->ifa_name);
    } else {
      printf("IPv4 addr %s: %s\n", ifa->ifa_name, buf);
    }
  }
  else if (AF_INET6 == ifa->ifa_addr->sa_family) {
    s6 = (struct sockaddr_in6 *)(ifa->ifa_addr);
    if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s6->sin6_addr), buf, sizeof(buf))) {
      printf("%s: inet_ntop failed!\n", ifa->ifa_name);
    } else {
      printf("IPv6 addr %s: %s\n", ifa->ifa_name, buf);
      }
  }

}


int main(int argc, char **argv){
  struct ifaddrs *myaddrs, *ifa;
  int status;

  status = getifaddrs(&myaddrs);
  if (status != 0){
    perror("getifaddrs failed!");
    exit(1);
  }

  for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next){
    if (NULL == ifa->ifa_addr){
      continue;
    }
    if ((ifa->ifa_flags & IFF_UP) == 0) {
      continue;
    }
    show_address_info(ifa);
  }
  freeifaddrs(myaddrs);
  return 0;
}

  • Generar un shell no es una opción en muchos entornos, como dentro de una biblioteca compartida. Si hace fork + exec, puede hacer que se ejecuten controladores atexit para el proceso al que está vinculada su biblioteca, lo que podría ser desastroso. Además, ¿cómo cree que se implementan esas utilidades de shell? Están implementados en C.

    – cmcabe

    5 abr 2015 a las 20:07

¿Qué tal si simplemente haces trampa y miras la fuente de /sbin/ifconfig/ ? No tiene nada de malo subirse a los hombros de otros gigantes…

Todavía no es una solución completa, pero eche un vistazo en /proc/net!

  • dev enumera los dispositivos de interfaz disponibles por nombre,
  • route enumera algunas rutas, al igual que ipv6_route,
  • arp enumera los dispositivos en la tabla de enrutamiento real (no incluye localhost).

No es tan de alta tecnología como la otra solución, pero se puede hacer con una simple lectura de archivos. Sin embargo, específico de Linux.

¿Como obtengo las direcciones IP de mi host desde un
qrdl

Necesitas la función POSIX getaddrinfo() – devuelve una lista enlazada de todas las direcciones IP.

Ver man getaddrinfo para detalles y ejemplos.

¿Como obtengo las direcciones IP de mi host desde un
pmg

$ sudo ifconfig | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1
213.xx.xxx.xx
192.168.xx.x
127.0.0.1

Y puedes poner eso en popen():

/* not tested */
ph = popen("sudo ifconfig | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1", "r");
while (fgets(buf, sizeof buf, ph)) {
    /* ip address, in nul-terminated string format, is in `buf` */
}
pclose(ph);

  • -1 para usar comandos de shell en código C. En mi opinión, esto no debería ser aconsejado. Una solución que utilice el idioma real y las llamadas al sistema/biblioteca es mucho mejor. Especialmente para una pregunta de principiante como esta.

    –Steve Lazaridis

    7 de enero de 2010 a las 19:50

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad