2013-02-14 21 views
7

Ho un semplice script che verifica periodicamente (una volta ogni pochi secondi) se c'è una connessione Internet da quel server. Per essere chiari, non si tratta di verificare se un sito/servizio/server esterno è vivo. Come destinazioni internet affidabili utilizzo IP di siti come google, yahoo, ecc. Normalmente utilizzo 3 destinazioni (LAN, rete ISP, fuori ISP)Come verificare la presenza della connessione internet in Perl?

Il mio codice corrente responsabile di questo è solo una semplice e sporca chiamata a ping:

my $pingResponse = `ping -c 1 -w 1 123.123.123.123`; 
    my $isConnected = parsePingResponse($pingResponse); 

Sembra funzionare, ma sono sicuro che non è il modo giusto/migliore per eseguire questo compito. Ci sono almeno 3 inconvenienti: chiamata di sistema esterna, è lenta, ha una scadenza relativamente di 1 secondo.

Quindi, la mia domanda è: come implementare semplice ed efficiente un ping funzionalità la Perl modo al fine di verificare se la connessione Internet è vivo?

(credo LWP è un eccessivo. Non è importante se un sito o una pagina è disponibile, solo se alcuni IP esterni sono raggiungibili. Probabilmente dovrebbe essere qualcosa di semplice che coinvolge rete di basso livello)

risposta

6

Il la Perl il modo per farlo sarebbe Net::Ping.

my $p = Net::Ping->new; 
if ($p->ping("123.123.123.123", 1)) { 
    print "Host is reachable\n"; 
} 

Il timeout può essere un valore a virgola mobile (ad esempio 0,5) se si desidera che il comando venga eseguito più rapidamente. Dovrai scegliere un timeout adatto alle tue esigenze; un timeout più elevato è più probabile che sia corretto sulla connettività Internet, ma richiederà più tempo.

+0

Grazie, sembra essere esattamente ciò di cui ho bisogno. I timeout e le destinazioni non sono un problema. Un'altra domanda, se potessi aiutare con questo: 'new' e' close' dovrebbero essere chiamati per ogni * ping *? (Voglio dire che il mio script è in esecuzione quasi 24 ore su 24 e mantenere le connessioni aperte non è un buon comportamento e probabilmente le macchine di destinazione le chiuderanno dopo un po ', gli IP sono diversi, quindi sto provando a non * flood * nessuno). – ArtM

+1

Supponendo che si stiano facendo ping TCP (impostazione predefinita), è possibile creare un singolo oggetto per la durata dello script e richiamare ripetutamente 'ping'. Non manterrà connessioni aperte. – rjh

+0

non so perché restituisco sempre false, ma in realtà posso eseguire il ping da console/terminale. –

2

L'esempio fornito da rjh sopra non funziona in molti casi perché non ha inizializzato correttamente il costruttore. Questo esempio di seguito potrebbe aiutare:

use Net::Ping; 

my $p = Net::Ping->new("icmp"); 
while(1){ 
printf "Checking for internet\n"; 
    if ($p->ping("www.google.com")){ 
    printf "Internet connection is active!\n"; 
     sleep 1; 
    last; #break out of while loop if connection found 
    } 
    else{ 
    printf "Internet connection not active! Sleeping..\n"; 
     sleep 60*60; 
    } 
} 
+0

Docs dice che new() ha il suo valore predefinito in args. – ArtM

Problemi correlati