2012-09-24 5 views
6

Ho un programma che ha due sezioni separate: una deve essere eseguita quando l'interfaccia di rete è LAN wireless e l'altra quando è una connessione LAN cablata . Come posso sapere che all'interno del mio programma? Quale funzione dovrei usare per ottenere queste informazioni?(C, Linux) Sapere se un'interfaccia di rete è wireless o cablata

+0

Che cosa succede se ci sono diverse interfacce di rete che sono tutti di essere utilizzati in parallelo? – unwind

+0

La parte wireless del codice verrà eseguita per quelli wireless e la parte cablata per quelli cablati, in parallelo. – deinocheirus

risposta

5

È possibile utilizzare il comando iwconfig dalla riga di comando:

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

Se è necessario utilizzare da C, come @ collegamento del opaca sopra spiega, ottenere i sorgenti o utilizzare strace per vedere quali ioctl() è necessario utilizzare:

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 

Vedi 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 ... mi dispiace, sono abbastanza nuovo qui. Posso scegliere sia la risposta che l'opaco come "la" risposta corretta? – deinocheirus

+0

Sfortunatamente no;) Puoi invitarli entrambi, ma dovresti accettare quello che risponde meglio alla tua domanda. La tua decisione :) –

+1

Ho implementato un codice di esempio qui: https://gist.github.com/edufelipe/6108057 –

2

E 'possibile ottenerlo da C, naturalmente.

Controllare questo link per informazioni su una domanda simile.

3

Se il nome del dispositivo è NETDEVICE, un controllo dell'esistenza della directory /sys/class/net/NETDEVICE/wireless è un predicato che è possibile utilizzare. Questo è un approccio solo per Linux, tuttavia, e presuppone che sia installato /sys, che è quasi sempre il caso normale. È anche più facile impiegare questo metodo dagli script, piuttosto che trattare con ioctl() s.

2

È possibile chiamare ioctl(fd, SIOCGIWNAME) che restituisce la versione del protocollo di estensione wireless, che è disponibile solo su interfacce wireless.

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; 
} 

Per un esempio completo vedere: https://gist.github.com/edufelipe/6108057

Problemi correlati