Repository 32bit  Forum
Repository 64bit  Wiki

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.

Monitorare le interfacce di rete in C

Messaggioda ulisse89 » gio feb 09, 2012 17: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 12: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 11: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: 2775
Iscritto il: dom lug 24, 2005 23: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 12: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 12: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 13: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
Linux Registered User #454438
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: 6194
Iscritto il: gio nov 03, 2005 14: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 16: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 12: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 2 ospiti

cron