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?
Su Linux: come posso determinare a livello di codice se un'interfaccia NIC è abilitata e collegata?
risposta
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.
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
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
@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
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
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.
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.
- aperta
AF_NETLINK
presa - legano a
sockaddr_nl
connl_groups = RTMGRP_LINK
- invia messaggio
RTM_GETLINK
kernel - make sondaggio/epoll sul socket per leggere
RTM_NEWLINK
eRTM_DELLINK
messaggi - riceverete lista interfacce iniziali e le sue modifiche in futuro
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 –