2013-02-14 25 views
7

मेरे पास एक साधारण स्क्रिप्ट है जो उस सर्वर से इंटरनेट कनेक्टिविटी होने पर समय-समय पर (प्रत्येक कुछ सेकंड में) सत्यापित करती है। स्पष्ट होने के लिए, यह जांचने वाला नहीं है कि बाहरी साइट/सेवा/सर्वर जिंदा है या नहीं। विश्वसनीय इंटरनेट गंतव्यों के रूप में मैं Google, याहू इत्यादि जैसी साइटों के आईपी का उपयोग करता हूं। आम तौर पर मैं 3 गंतव्यों (लैन, आईएसपी नेटवर्क, आईएसपी के बाहर) का उपयोग करता हूंपर्ल में इंटरनेट कनेक्शन की उपस्थिति की जांच कैसे करें?

इसके लिए ज़िम्मेदार मेरा वर्तमान कोड ping पर केवल एक साधारण और गंदे कॉल है:

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

ऐसा लगता है, लेकिन मुझे यकीन है कि यह इस कार्य को पूरा करने का सही/सर्वोत्तम तरीका नहीं है। कम से कम 3 दोष हैं: बाहरी सिस्टम कॉल, यह धीमा है, इसकी तुलना में अपेक्षाकृत लंबी की समय सीमा 1 सेकंड है।

तो, मेरे सवाल यह है: कैसे बस आदेश यदि इंटरनेट कनेक्शन जिंदा है सत्यापित करने के लिए लागू करने के लिए और कुशलता से एक पिंग कार्यक्षमता perlish तरीका है?

(मुझे लगता है कि LWP एक overkill है। यह महत्वपूर्ण नहीं है कि कोई साइट या एक पृष्ठ उपलब्ध है, बस अगर कुछ बाहरी आईपी पहुंचा जा सकता है। शायद यह कुछ सरल शामिल निम्न स्तर नेटवर्किंग होना चाहिए)

उत्तर

6

perlish ऐसा करने का तरीका Net::Ping होगा।

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

यदि आप तेजी से चलाने के लिए आदेश चाहते हैं तो टाइमआउट एक फ्लोट (उदा। 0.5) हो सकता है। आपको अपनी जरूरतों के अनुरूप एक टाइमआउट चुनना होगा; एक उच्च टाइमआउट इंटरनेट कनेक्टिविटी के बारे में सही होने की अधिक संभावना है, लेकिन इसमें अधिक समय लगेगा।

+0

धन्यवाद, ऐसा लगता है कि मुझे वही चाहिए। टाइमआउट और गंतव्यों एक मुद्दा नहीं हैं। एक और सवाल, यदि आप इससे मदद कर सकते हैं: हर * पिंग * के लिए 'नया' और 'क्लोज' कहा जाना चाहिए? (मेरा मतलब है कि मेरी स्क्रिप्ट लगभग 24/7 चल रही है और खुले कनेक्शन को रखना अच्छा व्यवहार नहीं है और शायद गंतव्य मशीनें थोड़ी देर बाद उन्हें बंद कर देंगी; आईपी अलग हैं, इसलिए मैं * बाढ़ * किसी को भी नहीं करने की कोशिश कर रहा हूं)। – ArtM

+1

मान लीजिए कि आप टीसीपी पिंग्स (डिफ़ॉल्ट) कर रहे हैं, आप स्क्रिप्ट के जीवनकाल के लिए एक ही वस्तु बना सकते हैं और बार-बार 'पिंग' को कॉल कर सकते हैं। यह खुले कनेक्शन नहीं रखेगा। – rjh

+0

पता नहीं क्यों मैं हमेशा झूठी वापसी करता हूं, लेकिन असल में मैं कंसोल/टर्मिनल से पिंग कर सकता हूं। –

2

ऊपर आरजेएच द्वारा दिया गया उदाहरण कई मामलों में काम नहीं करता है क्योंकि उन्होंने कन्स्ट्रक्टर को ठीक से शुरू नहीं किया है। नीचे दिया गया यह उदाहरण मदद कर सकता है:

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

डॉक्स कहता है कि नया() इसके तर्कों के लिए डिफ़ॉल्ट है। – ArtM

संबंधित मुद्दे