كيف يمكنني تحديد IP من جهاز التوجيه/بوابة في جافا ؟

StackOverflow https://stackoverflow.com/questions/11930

  •  08-06-2019
  •  | 
  •  

سؤال

كيف يمكنني تحديد IP من جهاز التوجيه/بوابة في جافا ؟ يمكنني الحصول على بلدي الملكية الفكرية بسهولة بما فيه الكفاية.يمكنني الحصول على بلدي الإنترنت IP باستخدام الخدمة على الموقع.ولكن كيف يمكنني تحديد بلدي البوابة الملكية الفكرية ؟

هذا هو إلى حد ما سهلة .صافي إذا كنت تعرف طريقك نحو.ولكن كيف يمكنك أن تفعل ذلك في جافا ؟

هل كانت مفيدة؟

المحلول

جافا لا تجعل هذا ممتعة قدر لغات أخرى للأسف.هنا هو ما فعلته:

import java.io.*;
import java.util.*;

public class ExecTest {
    public static void main(String[] args) throws IOException {
        Process result = Runtime.getRuntime().exec("traceroute -m 1 www.amazon.com");

        BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
        String thisLine = output.readLine();
        StringTokenizer st = new StringTokenizer(thisLine);
        st.nextToken();
        String gateway = st.nextToken();
        System.out.printf("The gateway is %s\n", gateway);
    }
}

ويفترض هذا أن العبارة الثانية رمزية و ليس الثالث.إذا كانت تحتاج إلى إضافة إضافية st.nextToken(); للنهوض tokenizer واحد أكثر من بقعة.

نصائح أخرى

على ويندوز, ماك, لينكس, إلخ ثم كريس مجموعة الجواب يمكن تحسنت كثيرا باستخدام

netstat -rn

في مكان traceroute الأوامر.

الخاص بك عنوان IP للعبارة سوف تظهر في الحقل الثاني من السطر الذي يبدأ إما default أو 0.0.0.0.

هذا يحصل حول عدد من المشاكل مع محاولة استخدام traceroute:

  1. على ويندوز traceroute هو في الواقع tracert.exe, لذلك ليس هناك حاجة O/S تبعيات في المدونة
  2. انها سريعة الأمر تشغيل - فإنه يحصل على المعلومات من O/S ، وليس من الشبكة
  3. traceroute في بعض الأحيان قد تم حظره من قبل الشبكة

الجانب السلبي الوحيد هو أنه سوف يكون من الضروري الحفاظ على قراءة خطوط من netstat الإخراج حتى الخط الصحيح ، حيث سيكون هناك أكثر من خط الانتاج.

تحرير: العبارة الافتراضية عنوان IP في الحقل الثاني من السطر الذي يبدأ بـ 'الافتراضي' إذا كنت على ماك (اختبار على الأسد) ، أو في الحقل الثالث من السطر الذي يبدأ بـ '0.0.0.0' (اختبار على ويندوز 7)

ويندوز:

الشبكة الوجهة قناع الشبكة واجهة العبارة متري

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

ماك:

الوجهة بوابة أعلام الحكام استخدام Netif تنتهي

الافتراضي 192.168.2.254 UGSc 104 4 en1

try{
    Process result = Runtime.getRuntime().exec("netstat -rn");

    BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));

    String line = output.readLine();
    while(line != null){
        if ( line.startsWith("default") == true )
            break;      
        line = output.readLine();
    }

    StringTokenizer st = new StringTokenizer( line );
    st.nextToken();
    gateway = st.nextToken();
    st.nextToken();
    st.nextToken();
    st.nextToken();
    adapter = st.nextToken();

} catch( Exception e ) { 
    System.out.println( e.toString() );
    gateway = new String();
    adapter = new String();
}

على ويندوز تحليل إخراج IPConfig سوف تحصل على العبارة الافتراضية, دون انتظار أي أثر.

قد يكون من الأفضل استخدام شيء من هذا القبيل checkmyip.org التي من شأنها تحديد عنوان IP العام - ليس بالضرورة أول هوب التوجيه:في الجامعة لدي "الحقيقي" عنوان IP ، بينما في الداخل هو بلدي المحلية الموجه عنوان IP العام.

يمكنك تحليل الصفحة التي يعود ، أو إيجاد موقع آخر يسمح لك فقط الحصول على عنوان IP يعود إلى سلسلة فقط.

(أنا معنى حمل عنوان URL هذا في جافا/أيا كان ، ومن ثم الحصول على المعلومات التي تحتاج إليها).

هذا ينبغي أن يكون تماما منصة مستقلة.

فيما يتعلق UPnP:تكون على علم بأن ليس كل الموجهات دعم UPnP.وإذا لم يفعلوا ذلك يمكن أن يكون مغلقا (لأسباب أمنية).لذلك الحل الخاص بك قد لا يعمل دائما.

يجب أن يكون أيضا نظرة على NatPMP.

بسيطة مكتبة UPnP يمكن العثور عليها في http://miniupnp.free.fr/, ، على الرغم من انها في ج...

للتغلب على القضايا المذكورة مع متتبع (ICMP القائم على مساحة واسعة ضرب) يمكن النظر في:

  1. متتبع إلى IP العام الخاص بك (يتجنب منطقة واسعة ضرب, ولكن لا يزال ICMP)
  2. استخدام غير ICMP فائدة مثل ifconfig/ipconfig (قابلية القضايا مع هذا على الرغم من).
  3. ما يبدو أفضل وأكثر المحمولة الحل الآن هو أن قذيفة & تحليل netstat (انظر التعليمات البرمجية المثال هنا)

إخراج netstat -rn هو لغة محددة.على نظام (لغة=دي) إخراج تبدو مثل:...Standardgateway:10.22.0.1

لذلك ليس هناك خط بدءا من "الافتراضي".

وذلك باستخدام netstat قد لا يكون فكرة جيدة.

هذا الإصدار يتصل www.whatismyip.com يقرأ محتوى الموقع و البحث عن طريق التعبيرات العادية ip عنوان يطبع إلى cmd.قليلا تحسين MosheElishas رمز

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader; 
import java.net.URL;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  

public class Main {

    public static void main(String[] args) {
        BufferedReader buffer = null;
        try {
            URL url = new URL(
                    "http://www.whatismyip.com/tools/ip-address-lookup.asp");
            InputStreamReader in = new InputStreamReader(url.openStream());
            buffer = new BufferedReader(in);
            String line = buffer.readLine();
            Pattern pattern = Pattern
                    .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)");
            Matcher matcher;
            while (line != null) {
                matcher = pattern.matcher(line);
                if (matcher.matches()) {
                    line = matcher.group(2) + "." + matcher.group(3) + "."
                            + matcher.group(4) + "." + matcher.group(5);
                    System.out.println(line);
                }
                line = buffer.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                if (buffer != null) {
                    buffer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader; 
import java.net.URL;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  

public class Main {

    public static void main(String[] args) {
        BufferedReader buffer = null;
        try {
            URL url = new URL(
                    "http://www.whatismyip.com/tools/ip-address-lookup.asp");
            InputStreamReader in = new InputStreamReader(url.openStream());
            buffer = new BufferedReader(in);
            String line = buffer.readLine();
            Pattern pattern = Pattern
                    .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)");
            Matcher matcher;
            while (line != null) {
                matcher = pattern.matcher(line);
                if (matcher.matches()) {
                    line = matcher.group(2) + "." + matcher.group(3) + "."
                            + matcher.group(4) + "." + matcher.group(5);
                    System.out.println(line);
                }
                line = buffer.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                if (buffer != null) {
                    buffer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

هذا ليس سهلا كما يبدو.جافا هو منصة مستقلة, لذلك أنا لست متأكدا من كيفية القيام بذلك في جاوة.أنا التخمين أن .صافي اتصالات بعض موقع على شبكة الإنترنت التي تفيد ذلك مرة أخرى.هناك عدة طرق للذهاب.أولا نظرة أعمق إلى ICMP بروتوكول قد تعطيك المعلومات التي تحتاج إليها.يمكنك أيضا تتبع IP تذهب من خلال (الطريق).عندما تواجه الملكية الفكرية التي ليست في النطاقات التالية:

  • 10.0.0.0 – 10.255.255.255
  • 172.16.0.0 – 172.31.255.255
  • 192.168.0.0 – 192.168.255.255

هو IP واحد هوب بعيدا عن لك ، وربما أسهم عدد قليل من ثماني بتات المعلومات مع IP الخاص بك.

حظا سعيدا.سوف يكون من الغريب أن نسمع إجابة شافية على هذا السؤال.

حاول القصف على متتبع إذا كان لديك.

'متتبع-م 1 www.amazon.com' سوف تنبعث منها شيئا مثل هذا:

traceroute to www.amazon.com (72.21.203.1), 1 hops max, 40 byte packets
 1  10.0.1.1 (10.0.1.1)  0.694 ms  0.445 ms  0.398 ms

تحليل الخط الثاني.نعم انها قبيحة, ولكن سوف تحصل على الذهاب حتى شخص المشاركات شيئا أجمل.

ماثيو:نعم هذا هو ما قصدته من "يمكنني الحصول على بلدي الإنترنت IP باستخدام الخدمة على الموقع." آسف عن كونه سطحي.

براين/نيك:متتبع سيكون على ما يرام باستثناء حقيقة أن الكثير من هذه الموجهات يكون ICMP تعطيل وبالتالي فإنه دائما الأكشاك.

أعتقد مزيج من متتبع و uPnP العمل بها.هذا ما كنت تخطط على القيام ، أنا آمل فقط كنت في عداد المفقودين شيء واضح.

شكرا للجميع على التعليقات الخاصة بك, لذلك يبدو أنني لست في عداد المفقودين أي شيء واضح.لقد بدأ تنفيذ بعض أجزاء من uPnP من أجل اكتشاف بوابة.

يمكنك الاستعلام URL "http://whatismyip.com/automation/n09230945.asp".على سبيل المثال:

    BufferedReader buffer = null;
    try {
        URL url = new URL("http://whatismyip.com/automation/n09230945.asp");
        InputStreamReader in = new InputStreamReader(url.openStream());
        buffer = new BufferedReader(in);

        String line = buffer.readLine();
        System.out.println(line);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (buffer != null) {
                buffer.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

في ويندوز يمكنك فقط استخدام الأمر التالي:

ipconfig | findstr /i "Gateway"

والتي سوف تعطيك الناتج مثل:

Default Gateway . . . . . . . . . : 192.168.2.1
Default Gateway . . . . . . . . . : ::

ومع ذلك لا أستطيع تشغيل هذا الأمر مع جافا ، ستعمل بعد عندما أنا هذا الرقم.

يمكنك استخدام netstat -rn الأمر الذي يتوفر على ويندوز, ماك, لينكس, الخ منصة.هنا هو بلدي رمز:

private String getDefaultAddress() {
        String defaultAddress = "";
        try {
            Process result = Runtime.getRuntime().exec("netstat -rn");

            BufferedReader output = new BufferedReader(new InputStreamReader(
                    result.getInputStream()));

            String line = output.readLine();
            while (line != null) {
                if (line.contains("0.0.0.0")) {

                    StringTokenizer stringTokenizer = new StringTokenizer(line);
                    stringTokenizer.nextElement(); // first element is 0.0.0.0
                    stringTokenizer.nextElement(); // second element is 0.0.0.0
                    defaultAddress = (String) stringTokenizer.nextElement();
                    break;
                }

                line = output.readLine();

            } // while
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return defaultAddress;

} // getDefaultAddress

أنا لست متأكدا مما إذا كان يعمل على كل نظام ولكن على الأقل أنا هنا وجدت هذا:

import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main
{
    public static void main(String[] args)
    {
        try
        {
            //Variables to find out the Default Gateway IP(s)
            String canonicalHostName = InetAddress.getLocalHost().getCanonicalHostName();
            String hostName = InetAddress.getLocalHost().getHostName();

            //"subtract" the hostName from the canonicalHostName, +1 due to the "." in there
            String defaultGatewayLeftover = canonicalHostName.substring(hostName.length() + 1);

            //Info printouts
            System.out.println("Info:\nCanonical Host Name: " + canonicalHostName + "\nHost Name: " + hostName + "\nDefault Gateway Leftover: " + defaultGatewayLeftover + "\n");
            System.out.println("Default Gateway Addresses:\n" + printAddresses(InetAddress.getAllByName(defaultGatewayLeftover)));
        } catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
    }
    //simple combined string out of the address array
    private static String printAddresses(InetAddress[] allByName)
    {
        if (allByName.length == 0)
        {
            return "";
        } else
        {
            String str = "";
            int i = 0;
            while (i < allByName.length - 1)
            {
                str += allByName[i] + "\n";
                i++;
            }
            return str + allByName[i];
        }
    }
}

بالنسبة لي هذا ينتج:

Info:
Canonical Host Name: PCK4D-PC.speedport.ip
Host Name: PCK4D-PC
Default Gateway Leftover: speedport.ip

Default Gateway Addresses:
speedport.ip/192.168.2.1
speedport.ip/fe80:0:0:0:0:0:0:1%12

كنت تحتاج إلى مزيد من الاختبارات على أنظمة أخرى/تشكيلات/PC-بوابة-الاجهزة لتأكيد ما إذا كان يعمل في كل مكان.أشك في ذلك ولكن هذا كان أول وجدت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top