Repository 32bit  Forum
Repository 64bit  Wiki

Monitorare le interfacce di rete in C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Monitorare le interfacce di rete in C

Messaggioda ulisse89 » gio feb 09, 2012 18:01

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
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 13:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: Monitorare le interfacce di rete in C

Messaggioda masalapianta » ven feb 10, 2012 12:26

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
masalapianta
Iper Master
Iper Master
 
Messaggi: 2358
Iscritto il: lun lug 25, 2005 0:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Re: Monitorare le interfacce di rete in C

Messaggioda ulisse89 » ven feb 10, 2012 13:07

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
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 13:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: Monitorare le interfacce di rete in C

Messaggioda targzeta » ven feb 10, 2012 14:05

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
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 5907
Iscritto il: gio nov 03, 2005 15:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Monitorare le interfacce di rete in C

Messaggioda ulisse89 » ven feb 10, 2012 17:46

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!
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 13:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite