ver una tengo tarjetas saber para monitorear listar interfaz interfaces cuantas configurar como comandos comando básicos c linux sockets

c - una - listar tarjetas de red linux



Obtener la dirección IP de una interfaz en Linux (5)

Además del método ioctl (), Filip demostró que puedes usar getifaddrs() . Hay un programa de ejemplo en la parte inferior de la página de manual.

¿Cómo puedo obtener la dirección IPv4 de una interfaz en Linux desde el código C?

Por ejemplo, me gustaría obtener la dirección IP (si corresponde) asignada a eth0.


Mis 2 centavos: el mismo código funciona incluso si iOS:

#include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <ifaddrs.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. showIP(); } void showIP() { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if( /*(strcmp(ifa->ifa_name,"wlan0")==0)&&( */ ifa->ifa_addr->sa_family==AF_INET) // ) { if (s != 0) { printf("getnameinfo() failed: %s/n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("/tInterface : <%s>/n",ifa->ifa_name ); printf("/t Address : <%s>/n", host); } } freeifaddrs(ifaddr); } @end

Simplemente eliminé la prueba contra wlan0 para ver los datos. ps Puedes eliminar "familia"


Prueba esto:

#include <stdio.h> #include <unistd.h> #include <string.h> /* for strncpy */ #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <net/if.h> #include <arpa/inet.h> int main() { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); /* I want to get an IPv4 IP address */ ifr.ifr_addr.sa_family = AF_INET; /* I want IP address attached to "eth0" */ strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); close(fd); /* display result */ printf("%s/n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); return 0; }

La muestra del código se toma de here .


Si está buscando una dirección (IPv4) de la interfaz específica, diga wlan0 , intente con este código que usa getifaddrs() :

#include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <ifaddrs.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(int argc, char *argv[]) { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET)) { if (s != 0) { printf("getnameinfo() failed: %s/n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("/tInterface : <%s>/n",ifa->ifa_name ); printf("/t Address : <%s>/n", host); } } freeifaddrs(ifaddr); exit(EXIT_SUCCESS); }

Puede reemplazar wlan0 por eth0 para ethernet y lo para local loopback.

La estructura y las explicaciones detalladas de las estructuras de datos utilizadas se pueden encontrar here .

Para saber más sobre la lista enlazada en C, esta page será un buen punto de partida.


Si no te importa el tamaño binario, puedes usar iproute2 como biblioteca.

iproute2-as-lib

Pros:

  • No es necesario escribir el código de la capa de socket.
  • Se puede obtener más o incluso más información sobre las interfaces de red. La misma funcionalidad con las herramientas de iproute2.
  • Interfaz API simple.

Contras:

  • el tamaño de la biblioteca iproute2-as-lib es grande. ~ 500kb.