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
- 1. Determinare se geolocalizzazione abilitata con reagisce nativo
- 2. Determinare se il backup a livello di sistema è abilitato a livello di programmazione
- 3. Come verificare se iCloud è configurato a livello di codice
- 4. Come posso creare presentazioni di PowerPoint a livello di codice. Su Linux Gratuito.
- 5. Come determinare a livello di codice nome dell'istanza CKEditor
- 6. Determinare se un dispositivo Android è rootato a livello di codice?
- 7. Come ottenere il fornitore USB e le informazioni sui prodotti a livello di codice su Linux?
- 8. Come è possibile determinare a livello di codice la codepage predefinita di Windows corrente?
- 9. Come posso sapere se SQLite è installato correttamente su Linux?
- 10. Determinare se Linux o Windows in C++
- 11. Come determinare a livello di codice se il checkout Git è un tag e, in tal caso, qual è il nome del tag
- 12. Posso dire a livello di programmazione se Spotlight è abilitato?
- 13. Controllare a livello di codice se la mia macchina ha accesso a Internet o no
- 14. Come posso aggiungere a livello di codice un livello sfumatura su un'immagine in Swift?
- 15. È possibile determinare a livello di programmazione se un video è in riproduzione?
- 16. È possibile determinare a livello di programmazione se un utente è autorizzato per un pacchetto?
- 17. Come controllare a livello di codice se un'applicazione è appendere in VB.NET
- 18. jUnit: come determinare il livello di copertura del codice?
- 19. Come determinare a livello di codice se un feed RSS è un feed completo o un feed parziale
- 20. Come determinare a livello di codice se la classe è una classe case o una classe semplice?
- 21. Come faccio a controllare a livello di codice se un'immagine animata è GIF?
- 22. Come posso determinare se un file è vuoto?
- 23. Rileva se l'entità è collegata a un datacontext
- 24. Come posso determinare se un metodo astratto è implementato?
- 25. Come impostare "Interazione utente abilitata" su UITextViews nel codice
- 26. Come posso aggiungere un contatto a livello di codice?
- 27. C'è un modo per vedere se una tastiera fisica è collegata a un dispositivo Windows 8?
- 28. Come faccio a controllare a livello di codice se un'immagine (PNG, JPEG o GIF) è corrotta?
- 29. Come posso determinare se un UILabel è stato toccato?
- 30. Come verificare se l'opzione wifi è abilitata o meno
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 –