2010-07-09 12 views
16

Voglio determinare se una scheda di rete è abilitata, attiva e collegata. Fondamentalmente, voglio sapere se la scheda di rete funzionerà. Ho bisogno di queste informazioni con un programma C++ e vorrei visualizzare un messaggio di errore quando la rete non funziona correttamente. Se possibile, vorrei evitare di usare i comandi della shell per determinare queste informazioni.Su Linux: come posso determinare a livello di codice se un'interfaccia NIC è abilitata e collegata?

+1

se vuoi solo determinare se la NIC è "up" usa 'ioctl()' con 'SIOCGIFFLAGS' per ottenere direttamente lo stato booleano vedi http://stackoverflow.com/questions/15723061/how-to-check-if -interface-is-up –

risposta

16

Puoi guardare /sys/class/net/eth0/operstate dove eth0 è la tua interfaccia per vedere se è attiva.

Vedere /sys/class/net/eth0/carrier per vedere se c'è un corriere.

Anche se suppongo che l'esecuzione di ifconfig e gli amici ti darà maggiore compatibilità con * BSD.

+0

Esiste qualcosa di altrettanto elegante per i kernel più vecchi? Sulla mia vecchia scatola CentOS 4, con kernel 2.6.9, non ho file "operstate" in/sys/class/net/eth ?. – Matt

+0

Sai come controllare lo stato del collegamento? C'è un file per quello? Come quando si usa ethtool eth0, l'output mostrerà il collegamento rilevato: SI – user1527227

+0

@EFraim Ho appena verificato che questo non funziona correttamente sul mio 2.6.31.Sembra che per un punto di accesso non sarà attivo fino a quando qualcuno non è connesso, mentre ifconfig mostra che è attivo. Questa è una distinzione molto grande. Non riesco facilmente a controllare questo adesso con il nuovo kernel. In altre parole, la bandiera si presenta, portante 0, inattivo verso il basso. – tothphu

4

Ricorda che su Linux "tutto" è un file.

Il modo migliore sarebbe utilizzare il kernel approvato < -> comunicazione dello spazio utente, ovvero sysfs, montato su /sys. I dispositivi di rete sono collegati a /sys/class/net

Se si desidera utilizzare l'interfaccia ioctl, guarda man netdevice

1

Come si desidera identificare la scheda di rete? Potresti provare a dare un'occhiata allo /etc/udev/rules.d/70-persistent-net.rules che mappa gli indirizzi MAC hardware in nomi simpatici (come eth0).

Quindi, quando si ha il nome più bello, è possibile eseguire operazioni come ethtool eth0 per determinare se è [fisicamente] connesso (ultima riga), ifconfig eth0 per determinare se è attivo (cercare "UP BROADCAST ...") e se ha un indirizzo IP.

Sono disposto a supporre che ci siano librerie automatiche per questo; ti sei guardato in giro? Non sono sicuro che ci sia codice facilmente accessibile in NetworkManager, ma dovrebbe essere un buon primo posto da guardare.

1

Eseguire l'output di getifaddrs, è possibile utilizzare il livello di collegamento per l'indirizzo MAC per identificare un adattatore e controllare lo ifa_flags per IFF_UP. Utilizzare AF_NETLINK per le notifiche relative alle modifiche dell'interfaccia.

4
  1. aperta AF_NETLINK presa
  2. legano a sockaddr_nl con nl_groups = RTMGRP_LINK
  3. invia messaggio RTM_GETLINK kernel
  4. make sondaggio/epoll sul socket per leggere RTM_NEWLINK e RTM_DELLINK messaggi
  5. riceverete lista interfacce iniziali e le sue modifiche in futuro
Problemi correlati