Pagina 1 di 1

Monitorare le interfacce di rete in C

Inviato: gio feb 09, 2012 17:01
da ulisse89
Ciao ragazzi,

vorrei sapere se conoscete un metodo per capire "al volo" (tipo per mezzo di eventi) se un interfaccia di rete non è più disponibile all'uso.
Per esempio se è stato scollegato il cavo ethernet, o anche se si è persa la connessione wifi.

Per ora so che è possibile monitorare la directory /sys/class/net e le informazioni all'interno di ogni subdirectory, ma in questo modo il processo
è costretto a leggere in continuazione da file e non può fare altro intanto.
Esiste qualche evento sollevato, o segnale che può essere mandato, quando un interfaccia di rete subisce un cambiamento?

Grazie,

Riccardo

Re: Monitorare le interfacce di rete in C

Inviato: ven feb 10, 2012 11:26
da masalapianta
ulisse89 ha scritto:Ciao ragazzi,

vorrei sapere se conoscete un metodo per capire "al volo" (tipo per mezzo di eventi) se un interfaccia di rete non è più disponibile all'uso.
Per esempio se è stato scollegato il cavo ethernet, o anche se si è persa la connessione wifi.

Per ora so che è possibile monitorare la directory /sys/class/net e le informazioni all'interno di ogni subdirectory, ma in questo modo il processo
è costretto a leggere in continuazione da file e non può fare altro intanto.
Esiste qualche evento sollevato, o segnale che può essere mandato, quando un interfaccia di rete subisce un cambiamento?

1) usi netlink (man 7 netlink) facendo polling sul relativo socket (per evitare che questo lavoro sia bloccante o usi la select oppure lo fai in un thread separato)
2) provi a vedere se le librerie di d-bus permettono di fare quanto chiedi

per del codice di esempio di 1: "apt-get source netplug" (ci sarebbe anche ifplugd, ma fa uso di ioctl che è un approccio peggiore rispetto all'usare netlink come fa netplug)

Re: Monitorare le interfacce di rete in C

Inviato: ven feb 10, 2012 12:07
da ulisse89
masalapianta ha scritto:1) usi netlink (man 7 netlink) facendo polling sul relativo socket (per evitare che questo lavoro sia bloccante o usi la select oppure lo fai in un thread separato)

Se devo fare polling probabilmente mi conviene utilizzare direttamente ifconfig lanciato con execl periodicamente, e analizzarne l'output.
Anche se è poco elegante come soluzione, è sicuramente più semplice.
masalapianta ha scritto:2) provi a vedere se le librerie di d-bus permettono di fare quanto chiedi


Provo a guardare se esiste qualcosa del genere.
Grazie,

Riccardo

Re: Monitorare le interfacce di rete in C

Inviato: ven feb 10, 2012 13:05
da targzeta
Attraverso SNMP puoi sapere un po' tutto sulle interfacce. La slackware ha già il pacchetto net-snmp, però devi un po' divertirti a capire se ti puoi interfacciare con lui in C e come, oppure interroghi i MIB direttamente dai comandi a linea di comando (scusa il gioco di parole). In particolare devi isare il MIB 'interface'. Guarda le variabili ifAdminStatus e ifOperStatus:
...
If ifAdminStatus is changed to up(1) then ifOperStatus should change to up(1) if the interface is ready to transmit and receive network traffic;
...


Io le ho studiate ste cose, ma non le ho mai usate :),
Emanuele

Re: Monitorare le interfacce di rete in C

Inviato: ven feb 10, 2012 16:46
da ulisse89
spina ha scritto:Attraverso SNMP puoi sapere un po' tutto sulle interfacce. La slackware ha già il pacchetto net-snmp, però devi un po' divertirti a capire se ti puoi interfacciare con lui in C e come, oppure interroghi i MIB direttamente dai comandi a linea di comando (scusa il gioco di parole). In particolare devi isare il MIB 'interface'. Guarda le variabili ifAdminStatus e ifOperStatus:
...
If ifAdminStatus is changed to up(1) then ifOperStatus should change to up(1) if the interface is ready to transmit and receive network traffic;
...


Io le ho studiate ste cose, ma non le ho mai usate :),
Emanuele


:D SNMP? L'ho studiato (molto in generale) nell'ultimo esame che ho dato.
Non avrei mai creduto che potesse tornarmi utile!