2012-09-24 18 views
6

Tengo un programa que tiene dos secciones separadas: una de ellas debe ejecutarse cuando la interfaz de red es LAN inalámbrica y la otra cuando es una conexión LAN cableada . ¿Cómo puedo saber eso dentro de mi programa? ¿Qué función debería usar para obtener esa información?(C, Linux) Saber si una interfaz de red es inalámbrica o cableada

+0

¿Qué pasa si hay varias interfaces de red que están siendo utilizados en paralelo? – unwind

+0

La parte inalámbrica del código se ejecutará para aquellos que son inalámbricos y la parte cableada para los que están cableados, en paralelo. – deinocheirus

Respuesta

5

Puede utilizar el comando iwconfig desde la línea de comandos:

$ iwconfig 
lo  no wireless extensions. 
eth0  no wireless extensions. 

Si necesita usar desde C, como @ enlace opaca anterior explica, descarga las fuentes o utilizar strace para ver qué ioctls() es necesario utilizar:

ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported) 
ioctl(3, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0 
write(2, "lo  no wireless extensions"..., 35lo  no wireless extensions. 

) = 35 
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported) 
ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0 
write(2, "eth0  no wireless extensions"..., 35eth0  no wireless extensions. 

) = 35 

Ver SIOCGIWNAME usage:

#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ 
/* SIOCGIWNAME is used to verify the presence of Wireless Extensions. 
* Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... 
+0

uhmm ... lo siento, soy bastante nuevo aquí. ¿Puedo elegir tanto su respuesta como opaque como "la" respuesta correcta? – deinocheirus

+0

Lamentablemente, no;) Puede revocarlos a ambos, pero debe aceptar el que mejor responda a su pregunta. Es su decisión :) –

+1

Implementé un código de ejemplo aquí: https://gist.github.com/edufelipe/6108057 –

2

Es posible obtenerlo de C, por supuesto.

Consulte esto link para obtener información sobre una pregunta similar.

3

Si el nombre del dispositivo es NETDEVICE, una comprobación de la existencia del directorio /sys/class/net/NETDEVICE/wireless es un predicado que puede usar. Sin embargo, este es un enfoque solo de Linux y supone que se monta /sys, que casi siempre es el caso normal. También es más fácil emplear este método a partir de scripts, en lugar de tratar con ioctl() s.

2

Puede llamar al ioctl(fd, SIOCGIWNAME) que devuelve la versión del protocolo de extensión inalámbrica, que solo está disponible en interfaces que son inalámbricas.

int check_wireless(const char* ifname, char* protocol) { 
    int sock = -1; 
    struct iwreq pwrq; 
    memset(&pwrq, 0, sizeof(pwrq)); 
    strncpy(pwrq.ifr_name, ifname, IFNAMSIZ); 

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
    perror("socket"); 
    return 0; 
    } 

    if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) { 
    if (protocol) strncpy(protocol, pwrq.u.name, IFNAMSIZ); 
    close(sock); 
    return 1; 
    } 

    close(sock); 
    return 0; 
} 

Para ver un ejemplo completo: https://gist.github.com/edufelipe/6108057

Cuestiones relacionadas