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.
¿Cómo comprobar Ethernet en Linux?
RAM812
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
implicaIFF_UP
yIFF_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/
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”.