যখন আমি আইপি ঠিকানাটি পিং করতে পারি তখন কেন ইনটাএড্রেস.আইসিসিচ্যযোগ্য মিথ্যা প্রত্যাবর্তন করে?


98
InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));

isReachableফিরে আসে কেন false? আমি আইপি পিন করতে পারেন


সম্ভাব্য অনুরূপ: stackoverflow.com/questions/4779367/...
assylias

4
এটা অনুরূপ. তবে আমি সমস্যাটি সমাধানের জন্য কোনও চিহ্ন খুঁজে পাইনি o সুতরাং আমি এটি এখানে পুনরায় সংশোধন করেছি। আপনার অনুস্মারক জন্য ধন্যবাদ!
jiafu

4
আমি সময়সীমা বাড়ানোর চেষ্টা করব
jayunit100

এটি একটি খুব ভাল প্রশ্ন, সেখানে পর্যাপ্ত পরিমাণ নেই। আমি খুঁজে পাওয়া একই একই প্রশ্নটি ক্লোজার প্রশ্ন হিসাবে ট্যাগ করা হয়েছিল এবং উত্তরটি বেআইনী ছিল।
jayunit100

4
কেউ কি আমাকে বলতে পারবেন যে রিচার্চযোগ্য () আসলে কী করে? এটি লোকালহোস্ট এমনকি আমাকে মিথ্যা ফিরিয়ে দেয় ...
শেঠ কেনো

উত্তর:


73

"IsReachable" পদ্ধতি অনেক ক্ষেত্রে আমার জন্য ব্যবহার যোগ্য ছিল না। আপনি যদি অনলাইনে এবং বাহ্যিক হোস্টগুলি (যেমন google.com) সমাধান করতে সক্ষম হন তবে কেবলমাত্র পরীক্ষার জন্য আমার বিকল্পটি দেখতে আপনি নীচে স্ক্রোল করতে পারেন ... যা সাধারণত * এনআইএক্স মেশিনে কাজ করে বলে মনে হচ্ছে।

সমস্যাটি

এ সম্পর্কে প্রচুর বকবক রয়েছে:

পর্ব 1: সমস্যার একটি পুনরুত্পাদনযোগ্য উদাহরণ

মনে রাখবেন যে এই ক্ষেত্রে, এটি ব্যর্থ।

       //also, this fails for an invalid address, like "www.sjdosgoogle.com1234sd" 
       InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
      for (InetAddress address : addresses) {
        if (address.isReachable(10000))
        {   
           System.out.println("Connected "+ address);
        }
        else
        {
           System.out.println("Failed "+address);
        }
      }
          //output:*Failed www.google.com/74.125.227.114*

পার্ট 2: একটি হ্যাকিশ ওয়ার্কারআউন্ড

বিকল্প হিসাবে, আপনি এটি করতে পারেন:

// in case of Linux change the 'n' to 'c'
    Process p1 = java.lang.Runtime.getRuntime().exec("ping -n 1 www.google.com");
    int returnVal = p1.waitFor();
    boolean reachable = (returnVal==0);

পিং -c বিকল্পটি পিংকে কেবল একবার সার্ভারে পৌঁছানোর চেষ্টা করার অনুমতি দেয় (অসীম পিংয়ের বিপরীতে যা আমরা টার্মিনালে ব্যবহার করছি)।

হোস্টটি যদি অ্যাক্সেসযোগ্য হয় তবে এটি 0 ফিরে আসবে । অন্যথায়, আপনি ফেরতের মান হিসাবে "2" পাবেন।

অনেক সহজ - তবে অবশ্যই এটি প্ল্যাটফর্ম নির্দিষ্ট। এবং এই কমান্ডটি ব্যবহার করার ক্ষেত্রে কিছু বিশেষ অধিকার থাকতে পারে - তবে আমি এটি আমার মেশিনে কাজ করে দেখছি।


দয়া করে নোট করুন: 1) এই সমাধানটি উত্পাদন মানের নয়। এটি হ্যাক একটি বিট। যদি গুগলটি ডাউন থাকে, বা আপনার ইন্টারনেট অস্থায়ীভাবে ধীর হয়ে গেছে, অথবা আপনার সুবিধাগুলি / সিস্টেম সেটিংসে কিছু মজাদারতা থাকলেও, যদি মিথ্যা নেতিবাচকতা ফিরে আসতে পারে (যেমন এটি ইনপুট ঠিকানায় পৌঁছা যায় তবুও এটি ব্যর্থ হতে পারে)। 2) isRachable ব্যর্থতা একটি অসামান্য সমস্যা। আবার - এখানে বেশ কয়েকটি অনলাইন সংস্থান রয়েছে যা ইঙ্গিত করে যে এই লেখার সময় এটি করার কোনও "নিখুঁত" উপায় নেই, জেভিএম হোস্টগুলিতে পৌঁছানোর চেষ্টা করার কারণে - আমি অনুমান করি এটি একটি অভ্যন্তরীণ প্ল্যাটফর্ম নির্দিষ্ট কাজ যা সহজ, যদিও , এখনও জেভিএম দ্বারা যথেষ্ট বিমূর্ত করা হয়নি।


@ জয়ুনিট 100 এর উভয় পদ্ধতির জন্যই কাজ করছে না, এর মধ্যে isReachableআমি ব্যর্থ হয়ে যাচ্ছি এবং পিং ব্যবহার করে আইসিএমপি অনুমোদিত হচ্ছি না? আপনি কি এখন এটি মোকাবেলা করতে জানেন?
যুবী

6
@ ইউভি আপনি যদি উইন্ডোজ ব্যবহার করেন তবে পতাকাগুলি পৃথক হয়। -C এর পরিবর্তে আপনি চান
জেমস টি স্নেল

প্রত্যাবর্তন () ফিরে আসতে 10 সেকেন্ড সময় নেয়। জাভা 7 এ টাইমআউট উল্লেখ করার কোনও উপায় আছে?
জয়দেব

@Jaydev, একটি ওভারলোড বিকল্প খুব হল: public boolean waitFor(long timeout, TimeUnit unit)java.lang.Process মধ্যে (1.8 @since)
অবিভাজ্য

2020-01 পর্যন্ত আমি কোনও সমস্যা ছাড়াই সমস্যার উদাহরণ চালাতে পারি, এটি একটি আইপিভি 4 এবং একটি আইপিভি 6 ঠিকানার জন্য "সংযুক্ত" প্রতিবেদন করে। বাগ এছাড়াও জাভা 5.0 b22 সংশোধন করা হয়েছে। সম্ভবত isReachableএখন আরও নির্ভরযোগ্য।
লিই

56

আমি এই একই প্রশ্নের উত্তর পেতে এখানে এসেছি, তবে আমি কোনও উত্তর দ্বারা অসন্তুষ্ট ছিলাম কারণ আমি একটি প্ল্যাটফর্মের স্বাধীন সমাধান খুঁজছিলাম। আমি যে কোডটি লিখেছি এবং প্ল্যাটফর্মটি স্বতন্ত্র সে কোডটি এখানে রয়েছে তবে অন্যান্য মেশিনে কোনও মুক্ত পোর্ট সম্পর্কে তথ্য প্রয়োজন (যা আমাদের বেশিরভাগ সময় থাকে)।

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    // Any Open port on other machine
    // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
    try {
        try (Socket soc = new Socket()) {
            soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        }
        return true;
    } catch (IOException ex) {
        return false;
    }
}

4
এটি একটি দুর্দান্ত প্ল্যাটফর্ম স্বাধীন সমাধান, আপনাকে ধন্যবাদ!
আইভান্ডভ

4
আমি খুশি আমি এখানেই শেষ হয়েছি, সৌরভের ভাবনার দুর্দান্ত উপায় :)
জাস্টাদেব

সুতরাং, কেবলমাত্র আমি সম্পূর্ণরূপে বুঝতে পেরেছি তা নিশ্চিত করার জন্য: যতক্ষণ না কোনও ব্যতিক্রম থাকবে, ঠিক ততক্ষণ ঠিকানাটি পৌঁছানো গেল?
টিমমিজ 9৩

4
এটি InetAddress.isReachable()ইতিমধ্যে পোর্ট via এর মাধ্যমে যা ঘটেছিল তার সমান , বাদে পরবর্তীটি পুনরায় IOExceptionsব্যবহারযোগ্যতার ক্ষেত্রে বিভিন্ন সম্ভাব্য মানে কী তা সম্পর্কে আরও বুদ্ধিমান ।
লার্নের মারকুইস

4
হ্যাঁ @ এজেপি আমার ধারণা InetAddress.isReachable(), মানক লাইব্রেরিতে বন্দরের যুক্তি অন্তর্ভুক্ত করার জন্য ওভারলোড করা হলে এটি দুর্দান্ত হবে । আমি ভাবছি কেন এটি অন্তর্ভুক্ত করা হয়নি?
সৌরভ ভাট

7

আপনি যদি কেবল এই পদ্ধতিটি ব্যবহার করে ইন্টারনেটের সাথে সংযুক্ত আছেন কিনা তা যদি পরীক্ষা করতে চান তবে ইন্টারনেট সংযুক্ত থাকলে এটি সত্য হয়ে যায়, আপনি প্রোগ্রামের মাধ্যমে সংযোগের চেষ্টা করছেন এমন সাইটের ঠিকানা ব্যবহার করা তার পছন্দনীয়।

     public static boolean isInternetReachable()
    {
        try {
            //make a URL to a known source
            URL url = new URL("http://www.google.com");

            //open a connection to that source
            HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();

            //trying to retrieve data from the source. If there
            //is no connection, this line will fail
            Object objData = urlConnect.getContent();

        } catch (Exception e) {              
            e.printStackTrace();
            return false;
        }

        return true;
    }

4
সার্ভারের কোনও ওয়েব সার্ভার না থাকলে অকেজো, এটি মোটেই প্রশ্নে বর্ণিত শর্ত নয়।
ফরাসী মার্জোয়া 14

4

অন্যান্য উত্তরগুলি না বলে কেবল এটি স্পষ্টভাবে উল্লেখ করছি। IsReachable () এর পিং অংশটির ইউনিক্সে রুট অ্যাক্সেস প্রয়োজন। এবং হিসাবে 4779367 সালে বেসটেস দ্বারা নির্দেশিত :

এবং আপনি যদি জিজ্ঞাসা করেন যে বাশ থেকে পিং কেন না, আসলে এটিরও প্রয়োজন। যে ls -l / বিন / পিং।

যেহেতু আমার ক্ষেত্রে রুট ব্যবহার করা কোনও বিকল্প ছিল না সমাধানটি হ'ল ফায়ারওয়ালের পোর্ট 7টিতে আমার যে আগ্রহী আগ্রহী সেই নির্দিষ্ট সার্ভারে প্রবেশের অনুমতি দেওয়া।


4

২০১২ সালে যখন মূল প্রশ্নটি জিজ্ঞাসা করা হয়েছিল তখন আমি কী ছিল তা নিশ্চিত নই।

এখন যেমন রয়েছে, পিংকে মূল হিসাবে কার্যকর করা হবে। পিং এক্সিকিউটেবলের অনুমোদনের মাধ্যমে আপনি + এর পতাকা এবং মূলের অন্তর্ভুক্ত প্রক্রিয়াটি দেখতে পাবেন, যার অর্থ এটি রুট হিসাবে চলবে। পিংটি কোথায় রয়েছে সেদিকে এলএস-লিয়াত চালান এবং আপনার এটি দেখা উচিত।

সুতরাং, যদি আপনি InetAddress.getByName ("www.google.com") চালনা করেন is তবে পাঠযোগ্য (5000) মূল হিসাবে, এটি সত্য হওয়া উচিত।

আইসিএমপি (পিং দ্বারা ব্যবহৃত প্রোটোকল) ব্যবহৃত কাঁচা সকেটের জন্য আপনার যথাযথ অনুমোদন দরকার

InetAddress.getByName পিংয়ের মতো নির্ভরযোগ্য তবে প্রক্রিয়াটি সঠিকভাবে চালিত হওয়ার জন্য আপনার যথাযথ অনুমতি প্রয়োজন।


0

যেহেতু আপনি কম্পিউটারটি পিং করতে পারেন, তাই আপনার জাভা প্রক্রিয়াটি চেকটি সম্পাদন করার জন্য পর্যাপ্ত অধিকার সহ চালানো উচিত। সম্ভবত নিম্ন পরিসরে পোর্ট ব্যবহারের কারণে। আপনি যদি নিজের জাভা প্রোগ্রামটি sudo / superuser দিয়ে চালান তবে আমি বাজি ধরব এটি কার্যকরভাবে কাজ করে।


স্বল্প পরিসরে পোর্টগুলির সাথে সংযোগ স্থাপনের জন্য আপনার বিশেষাধিকারের প্রয়োজন নেই ।
মার্নকুইস লর্নে

0

আমি পরামর্শ দিচ্ছি যে ইন্টারনেট সংযোগ পরীক্ষা করার একমাত্র নির্ভরযোগ্য উপায় হ'ল প্রকৃতপক্ষে কোনও ফাইল সংযোগ স্থাপন এবং ডাউনলোড করা বা এক্সিকিউটিভ () এর মাধ্যমে কোনও ওএস পিং কলের আউটপুট পার্স করা। আপনি পিংয়ের জন্য প্রস্থান কোডের উপর নির্ভর করতে পারবেন না এবং isReachable () ক্রেপ হয়।

আপনি যদি পিং কমান্ডটি সঠিকভাবে সম্পাদন করে তবে এটি 0 হিসাবে ফিরে আসায় আপনি পিং প্রস্থান কোডের উপর নির্ভর করতে পারবেন না। দুর্ভাগ্যক্রমে, পিং সঠিকভাবে সম্পাদন করে যদি এটি লক্ষ্য হোস্টে পৌঁছতে না পারে তবে আপনার বাড়ির এডিএসএল রাউটার থেকে একটি "গন্তব্য হোস্টটি না পারা যায়" gets এটি এমন এক প্রতিক্রিয়া যা সাফল্যজনক হিট হিসাবে বিবেচিত হয়, সুতরাং প্রস্থান কোড = ০. এটি যোগ করতে হবে যদিও এটি একটি উইন্ডোজ সিস্টেমে রয়েছে। * নিক্স পরীক্ষা করা হয়নি।


0
 private boolean isReachable(int nping, int wping, String ipping) throws Exception {

    int nReceived = 0;
    int nLost = 0;

    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec("ping -n " + nping + " -w " + wping + " " + ipping);
    Scanner scanner = new Scanner(process.getInputStream());
    process.waitFor();
    ArrayList<String> strings = new ArrayList<>();
    String data = "";
    //
    while (scanner.hasNextLine()) {
        String string = scanner.nextLine();
        data = data + string + "\n";
        strings.add(string);
    }

    if (data.contains("IP address must be specified.")
            || (data.contains("Ping request could not find host " + ipping + ".")
            || data.contains("Please check the name and try again."))) {
        throw new Exception(data);
    } else if (nping > strings.size()) {
        throw new Exception(data);
    }

    int index = 2;

    for (int i = index; i < nping + index; i++) {
        String string = strings.get(i);
        if (string.contains("Destination host unreachable.")) {
            nLost++;
        } else if (string.contains("Request timed out.")) {
            nLost++;
        } else if (string.contains("bytes") && string.contains("time") && string.contains("TTL")) {
            nReceived++;
        } else {
        }
    }

    return nReceived > 0;
}

এনপিং হল আইপি (প্যাকেট) পিং করার চেষ্টা করার সংখ্যা, আপনার যদি ব্যস্ত নেটওয়ার্ক বা সিস্টেমগুলি বিজার এনপিং নম্বর চয়ন করে।
উইপিং আইপি থেকে পংয়ের জন্য অপেক্ষা করছে, আপনি
এই পদ্ধতিটি ব্যবহারের জন্য 2000 মিমি সেট করতে পারেন আপনি এটি লিখতে পারেন:

isReachable(5, 2000, "192.168.7.93");

সম্ভাব্য কমান্ড ইঞ্জেকশন, এটি চালানোর আগে স্ট্রিং ইনপুটটি যাচাই করতে ভুলবেন না
গুপ্তচর

"সাধারণ ব্যর্থতা" ত্রুটি বার্তাও রয়েছে। এটি নির্দিষ্ট উইন্ডোগুলির মতো দেখায়। আমি নিশ্চিত যে এই ত্রুটি বার্তাগুলি বিভিন্ন ভাষায় স্থানীয়করণ করা হয়েছে, তাই সুপার পোর্টেবল নয়।
গুপ্তচর

এটি উইন্ডোজ সিস্টেমের জন্য।
আরমিন মোক্রি

হ্যাঁ আমি এটি উইন্ডোতে আগে দেখেছি
গুপ্তচর

0

বা এইভাবে ব্যবহার:

public static boolean exists(final String host)
{
   try
   {
      InetAddress.getByName(host);
      return true;
   }
   catch (final UnknownHostException exception)
   {
      exception.printStackTrace();
      // Handler
   }
   return false;
}

0

InetAddress.isReachable flappy হয়, এবং কখনও কখনও আমরা পিং করতে পারেন যে ঠিকানাগুলির জন্য অ্যাক্সেস অযোগ্য ফেরত।

আমি নিম্নলিখিত চেষ্টা করেছিলাম:

ping -c 1 <fqdn>এবং পরীক্ষা করুন exit status

আমি চেষ্টা করেছিলাম এমন সমস্ত ক্ষেত্রে InetAddress.isReachableকাজ করে যেখানে কাজ করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.