¿Cómo comprobar Ethernet en Linux?

3 minutos de lectura

avatar de usuario
RAM812

Necesito el caso de prueba para Ethernet en Linux usando código C para verificar eth0. Si eth0 está inactivo, habilitamos la red, luego verificamos si está activo y se pasa la prueba.

avatar de usuario
CiertoY

Para verificar si el enlace está activo, intente algo como esto. Funciona sin privilegios de root.

#include <stdio.h>        // printf
#include <string.h>       // strncpy
//#include <sys/socket.h> // AF_INET
#include <sys/ioctl.h>    // SIOCGIFFLAGS
#include <errno.h>        // errno
#include <netinet/in.h>   // IPPROTO_IP
#include <net/if.h>       // IFF_*, ifreq

#define ERROR(fmt, ...) do { printf(fmt, __VA_ARGS__); return -1; } while(0)

int CheckLink(char *ifname) {
    int state = -1;
    int socId = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (socId < 0) ERROR("Socket failed. Errno = %d\n", errno);

    struct ifreq if_req;
    (void) strncpy(if_req.ifr_name, ifname, sizeof(if_req.ifr_name));
    int rv = ioctl(socId, SIOCGIFFLAGS, &if_req);
    close(socId);

    if ( rv == -1) ERROR("Ioctl failed. Errno = %d\n", errno);

    return (if_req.ifr_flags & IFF_UP) && (if_req.ifr_flags & IFF_RUNNING);
}

int main() {
    printf("%d\n", CheckLink("eth0"));
}

Si se establece IFF_UP, significa que la interfaz está activa (ver ifup). Si se establece IFF_RUNNING, la interfaz está conectada. También intenté usar la llamada ioctl de ethtool, pero falló cuando el gid no era root. Pero solo para el registro:

...
#include <asm/types.h>     // __u32
#include <linux/ethtool.h> // ETHTOOL_GLINK
#include <linux/sockios.h> // SIOCETHTOOL
...
int CheckLink(char *ifname) {
    ...
    struct ifreq if_req;
    (void) strncpy( if_req.ifr_name, ifname, sizeof(if_req.ifr_name) );

    struct ethtool_value edata;
    edata.cmd = ETHTOOL_GLINK;
    if_req.ifr_data = (char*) &edata;

    int rv = ioctl(socId, SIOCETHTOOL, &if_req);
    ...

    return !!edata.data;
}

  • @TrueY: una pregunta, suponiendo que solo quiero obtener el estado del enlace, ¿cuál es la diferencia entre obtenerlo a través de ETHTOOL_GLINK frente a SIOCGIFFLAGS? Hace ethtool_value.data == 1 implica IFF_UP y IFF_RUNNING. He hecho una pregunta detallada sobre esto en stackoverflow.com/questions/33039485/…. Por favor, hágame saber sus pensamientos al respecto.

    – Vivek Maran

    10/10/2015 a las 20:45

  • @Vivek Fue hace bastante tiempo, pero creo que si edata.data == 1, entonces la interfaz está EN FUNCIONAMIENTO.

    – CiertoY

    11/10/2015 a las 21:09

  • ¿Puedo usar lo mismo en un entorno virtual? ¿Cómo puedo configurar la interfaz en un entorno virtual? Estoy ejecutando un programa de prueba que verifica el indicador IFF_RUNNING cada 500 milisegundos. No estoy recibiendo la interfaz inactiva, siempre encuentra el indicador IFF_RUNNING establecido. Necesito ayuda en este asunto.

    – Brijesh Valera

    27 de septiembre de 2019 a las 7:11

Las interfaces de red se pueden ver en sysfs: /sys/class/net/eth[x]. Allí puede verificar el enlace, el estado de la interfaz y más.

Es posible que desee aprovechar libudev para moverse en /sys:

http://www.signal11.us/oss/udev/

avatar de usuario
loxxy

Simplemente compruebo si una dirección IP está asignada a la tarjeta de red.

Puede usar algo como esto para verificar si la LAN está activa en la tarjeta de red dada (digamos eth0) :

/sbin/ifconfig eth0| grep 'inet addr:' | wc -l

Esto simplemente debería devolver 0 o 1 en función de si se asigna o no una dirección IP a la NIC.

También puedes usar Yann Ramin método para enumerar todos los nic y realizar la verificación.


No me di cuenta de que estás buscando el código de CA. Tal vez sería bueno agregar una etiqueta.

De cualquier manera, creo que puedes mirar el mismo archivo (ifconfig) manualmente en c leyéndolo por una ip.

Como esta pregunta es algo importante, agregaré otra respuesta a pesar de su edad extrema. Puede leer el contenido de /sys/class/net/eth0/operstate que simplemente contendrá la cadena “arriba\n” o “abajo\n”.

¿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