Monitorare le interfacce di rete in C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Monitorare le interfacce di rete in C

Messaggio 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

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: Monitorare le interfacce di rete in C

Messaggio 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)

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: Monitorare le interfacce di rete in C

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Monitorare le interfacce di rete in C

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: Monitorare le interfacce di rete in C

Messaggio 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!

Rispondi