2013-08-19 12 views
7

मैं एक मेजबान के लिए निम्न कोडवैकल्पिक

if(!InetAddress.getByName(host).isReachable(TIMEOUT)){ 
    throw new Exception("Host does not exist::"+ hostname); 
} 

होस्ट नाम मैं खिड़कियों से पिंग करने में सक्षम हूँ तक पहुँचने और के लिए कोशिश कर रहा हूँ, और यह भी एक किया इस पर ट्रैकर्ट और यह सभी पैकेट लौटाता है। लेकिन जावा अपवाद फेंकता है "होस्ट मौजूद नहीं है ::";

टाइमआउट मान मैंने 2000ms, 5000ms देने से प्रयोग किया। मैंने 3000 की भी कोशिश की। इस समस्या का कारण क्या है जिसे मैं समझ नहीं पा रहा हूं। मैंने नेट पर शोध किया और कुछ कहते हैं कि InetAddress.getByName (होस्ट) .isReachable (समय) विश्वसनीय नहीं है और आंतरिक प्रणाली के अनुसार व्यवहार करता है।

यदि यह सच है तो इसके लिए सबसे अच्छा विकल्प क्या है। कृपया सुझाव दे।

+0

जिस मेजबान के साथ मैं परीक्षण कर रहा हूं वह पहुंच योग्य है और मैं इसे विंडोज़ में पिंग करने में सक्षम हूं। –

उत्तर

14

या तो एक बंदरगाह आपको लगता है खुला है (लिनक्स के लिए 22, विंडोज के लिए 139, आदि)

public static boolean isReachableByTcp(String host, int port, int timeout) { 
    try { 
     Socket socket = new Socket(); 
     SocketAddress socketAddress = new InetSocketAddress(host, port); 
     socket.connect(socketAddress, timeout); 
     socket.close(); 
     return true; 
    } catch (IOException e) { 
     return false; 
    } 
} 

करने के लिए एक टीसीपी सॉकेट खोलने या कुछ हैक का उपयोग एक वास्तविक पिंग भेजने के लिए। (यहाँ से प्रेरित: http://www.inprose.com/en/content/icmp-ping-in-java)

public static boolean isReachableByPing(String host) { 
    try{ 
     String cmd = ""; 

     if(System.getProperty("os.name").startsWith("Windows")) 
      cmd = "cmd /C ping -n 1 " + host + " | find \"TTL\""; 
     else 
      cmd = "ping -c 1 " + host; 

     Process myProcess = Runtime.getRuntime().exec(cmd); 
     myProcess.waitFor(); 

     return myProcess.exitValue() == 0; 
    } catch(Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 
Android के लिए

ही हैक पाया जा सकता है here:

+1

विंडोज पर 'पिंग-एन 1' के साथ समस्या यह है कि "गंतव्य होस्ट पहुंच योग्य नहीं है।" नतीजा 0 का एक्जिट कोड देता है, इससे कई झूठे सकारात्मक बनाते हैं। –

+1

मैं एंड्रॉइड के साथ इसका उपयोग कैसे कर सकता हूं? –

+0

एंड्रॉइड के साथ पिंग: http://stackoverflow.com/questions/3905358/how-to-ping-external-ip-from-java-android – Shloim

0

मैंने पाया कि ping -n 1 hostname या तो विश्वसनीय नहीं है। यदि आपको Reply from X.X.X.X: Destination host unreachable. मिलता है तो कमांड वास्तव में 0 का एक्ज़िट कोड देता है, इस प्रकार आपको बहुत सारे झूठे सकारात्मक संकेत मिलते हैं।

समाधान परिणाम में स्ट्रिंग "टीटीएल" की खोज करना है, क्योंकि यह केवल तब मौजूद होता है जब आप सफल पिंग प्राप्त करते हैं। क्योंकि कमांड में पाइप है, आपको cmd /C का उपयोग करने की भी आवश्यकता है। मैं यूनिक्स बराबर का यकीन नहीं है, और एक यूनिक्स मशीन पर परीक्षण करने के लिए की जरूरत नहीं है

public boolean isReachable(String hostname) throws IOException, InterruptedException { 
    Process p = Runtime.getRuntime().exec(
      "cmd /C ping -n 1 "+hostname+" | find \"TTL\"" 
    ); 
    return (p.waitFor() == 0); 
} 

:

यहाँ एक उदाहरण (विंडोज़) है।

0

एंड्रॉइड डेवलपर्स के लिए: उपरोक्त विधि काम नहीं करती है अगर inet अनुपलब्ध है (अधिक सटीक रूप से जब DNS कैश टाइमआउट में चलता है); मुझे क्या मिला: डीएसएन लुकअप हमेशा लगभग 1 मिनट लेता है।

मेरे कोड की तरह निम्नलिखित है:

TIMEOUT = 5000; 
socket.connect(new InetSocketAddress(ServerDomainName, Port), TIMEOUT); 

यह उम्मीद है कि connect के बारे में 5 सेकंड के भीतर एक समय समाप्ति अपवाद फेंकता है, लेकिन समय के 65 सेकंड था जब inet नहीं पहुंचा जा सकता था (किसी को यह रूप में नकली inet संबंध का वर्णन करता है : कनेक्टिविटी का कहना है से जुड़ा हुआ है, लेकिन inet पहुंच योग्य नहीं है)।

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