Ho bisogno di un modo per notificare l'app dello spazio utente quando un'interfaccia di rete è abilitata o disabilitata. Spero di farlo senza ricorrere al sondaggio. Il kernel offre una sorta di hook per l'attivazione delle funzioni di callback quando si verificano eventi relativi alla rete?Ricevi notifiche sulla modifica dell'interfaccia di rete su Linux
risposta
Credo che il netlink (man 7 netlink
) impianto fornisce informazioni sulle interfacce di rete tramite il NETLINK_ROUTE
famiglia (man 7 rtnetlink
). Potresti riuscire a select()
o poll()
su un socket netlink per ottenere le informazioni desiderate. Non ne sono sicuro, però; Non l'ho usato da solo.
Ad un livello superiore, se il sistema è in esecuzione NetworkManager, trasmetterà eventi tramite D-Bus quando lo stato della rete del sistema cambia. Il browser Epiphany utilizza questi eventi, ad esempio, per attivare automaticamente la modalità "Non in linea" quando il sistema perde la connessione di rete e torna alla modalità online quando riprende la connettività di rete. Ci sono librerie client D-Bus per una varietà di lingue, ed è meno specifico della piattaforma di netlink, quindi questo è quello che consiglio di utilizzare.
Opzioni:
ifplugd
verrà eseguito lo script di vostra scelta quando un cavo è collegato o scollegato dalla propria interfaccia di rete.Se si utilizza Debian, è possibile aggiungere uno script alle sottodirectory di
/etc/network
, in cui sono presenti script eseguiti ogni volta che un'interfaccia sale o scende.Se nessuno dei precedenti è adatto alle proprie esigenze, consultare D-Bus. Non ho mai avuto molta fortuna ad usarlo con successo, ma questo è il genere di cosa per cui è stato progettato.
Perché non fare un fork
nel codice, utilizzando popen
a che vedere né:
- Problema
tail -f /var/log/messages
alla ricerca dieth*
interfacce - Issue
ifconfig
per vedere l'elenco delle schede di andare verso l'alto o verso il basso
e analizzare i dati utilizzando un pregex
, fare un per un periodo di tempo e ricontrollare di nuovo .. O si potrebbe andare monitor e funzione di registro del sistema utilizzando le funzioni 'syslog.h'.
Se attaccate allo standard POSIX, il codice sarà portabile su diverse versioni di Unix/Linux/BSD ...
"ifconfig' non è POSIX e l'output effettivamente varia molto da un UNIX all'altro. Certo, è (per lo più) lo stesso su tutti i Linux, ma anche lì ci sono due diverse versioni in uso comune (Busybox e net-tools's). – ephemient
Senza polling o affidamento su ganci OS come Norman Ramsey ha suggerito, l'unica opzione è quella di controlla periodicamente l'interfaccia di lavoro contro ciò che era pochi secondi fa. Questo porta solo alla coda evento/rx/tx, se l'idea è di accodare/bloccare l'attesa del chatter quando il collegamento non è disponibile.
Inoltre, gli script Debian funzionano in congiunzione con gli script di init, i hook che forniscono non ti dicono se root ha usato ifconfig per down o modificare un'interfaccia configurata, o ne ha configurata una nuova che non è stata descritta per init . Ti dicono solo se l'utente ha fatto qualcosa tramite /etc/init.d/networking, o se init ha fatto lo stesso.
Cosa c'è di così terribilmente infelice nell'iniziare una discussione per il polling delle modifiche?
In mancanza di ciò, sì, si potrebbe avviare un processo di 'netnicmond' che ha segnalato un elenco di iscritti per far loro sapere che qualcosa cambiato, o una più complessa che in realtà trasmesso le modifiche. Probabilmente useresti netlink per questo ...
Hai mai pensato di usare netlink?
- 1. Ricevi notifiche sulla modifica di una pagina in UIWebView
- 2. Ricevi notifiche correnti android
- 3. Ricevi notifiche per i documenti modificati in mongodb
- 4. Ricevi notifiche quando DTE.ActiveDocument cambia
- 5. Ricevi notifiche quando l'utente carica su un bucket S3?
- 6. Ricevi notifiche quando un file cambia su dropbox
- 7. Modifica del timeout TCP per un dispositivo di rete linux
- 8. Laravel ricevi l'url sulla stringa
- 9. ricevere notifiche sulla modifica del fuso orario in iOS
- 10. Come essere avvisati sulla modifica dello stato della rete wifi?
- 11. Ricevi notifiche sulle immagini trascinate all'interno di un divento contentedabile
- 12. WebRTC sulla rete locale?
- 13. Utilizzo di notifiche push basate sulla posizione su iOS
- 14. Cookie corruzione sulla rete mobile
- 15. Serializzazione Java sulla rete
- 16. Ricevi messaggio broadcast su Android
- 17. Ricevi notifiche push Android anche se l'app è chiusa
- 18. Crea un'interfaccia di rete virtuale in Linux?
- 19. Socket.io/node.js sulla rete locale?
- 20. non inotify notifiche di attivazione su file
- 21. * sulla riga di comando linux
- 22. Come condividere jboss sulla rete
- 23. Ricevi tutti i post sulla bacheca di un amico
- 24. Creazione di una chiave asimmetrica sulla rete
- 25. Problema con PhoneGap Informazioni sulla rete Plugin su iOS
- 26. Ricevi sms su asterisco sorso
- 27. Notifiche push duplicate su iOS
- 28. Mostra notifiche ubuntu (linux) con Qt
- 29. Modifica dello sfondo su Linux a livello di programmazione
- 30. Come posso ottenere le statistiche di throughput corrente dell'interfaccia di rete su Linux/UNIX?
Informazioni su "rtnetlink", è possibile controllare questo collegamento per il codice di esempio: http://stackoverflow.com/a/2353441/1435026 – fanyangxi