# IP auflisten



## chrism120 (2. Sep 2019)

Servus, ich möchte für zwei verschiedene eingegebene Adressen versuchen, zu prüfen ob die Rechner erreichbar sind und die aufzulisten. ich weiß, was ich falsch gemacht habe. Danke schon im Voraus für Ihre Hilfe. Zudem habe ich eine andere Frage. wie kann ich den Inhat von zwei verschieden Arrays mit gleichen Länge vergleichen. die Methode Arrays.deepequals () und Arrays.equals() machen nicht genau was ich möchte, denn ich möchte, dass das erste Feld von der erste Adresse größer als dieses von der zweiten Adresse. ZB: wenn ich folgendes haben 10.10.10.10 -9.11.21.21 solltest es unmöglich sein die Adressen aufzulisten. Es ist ein bisschen lang geschrieben bitte kann jemand einen Blick darauf werfen. ich danke noch mal im Voraus




```
package heritage;

import java.io.IOException;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.Scanner;

public class IPhoc {

    public static void main(String[] args) {
         int timeout=1000;
         Scanner s1,s2;
         String p1,p2;
        byte ip1[];
         byte ip2[];
        s1= new Scanner (System.in);
         System.out.println("Erste Adresse  : ");
         p1=s1.nextLine();
         System.out.println("zweite Adresse :");
         s2=new Scanner(System.in);
         p2=s2.nextLine();
         //String zu Byte konvertieren
       
        ip1= p1.getBytes();
        ip2=p2.getBytes();
       
            for (int i = 1; i < 255; i++) {
                try {
                   
                    if (!Arrays.equals(ip1, ip2)) {
                         
                           while(!Arrays.equals(ip1,ip2)) {
                        InetAddress ad = InetAddress.getByName(bytesToIpv4(ip1));
                        count(ip1);
                     
                        if (ad.isReachable(timeout)) {    
System.out.println("Der Computer " + ad.getHostName() + " mit IP Adressse " + bytesToIpv4(ip1) + " ist erreichbar");

                           
                        }
                     /*   else {
                            System.out.println(" Der Computer ist nichr verfügbar");
                        }
                        */
                     
                                                       }
                                                  }
           
                    else {
                      System.out.println("Die Adressen müssen verschieden sein");
                      }
                   
                   
                     {
                        }
                   
                        } catch (IOException e) {}
}
    }

    // Konvertierung von IPV4 zu Byte
public static byte[] ipv4ToBytes(String ip) {
   
   
     String[] parts = ip.split("\\.");
        byte[] result = new byte[4];
        int i=0;
       
        while (i<result.length) {
            result[i] = (byte) Integer.parseInt(parts[i]);
            i++;
           
        }
       
        return result;
}

public static byte[] count(byte[] value) {
        int i = value.length;
        do {
            i--;
            value[i]++;
        } while (value[i]== 0);
        return value;
    }
    // Konvertierung von Byte zu IPV4
    public static String bytesToIpv4(byte[] value) {
        return String.format("%d.%d.%d.%d",
                value[0] & 0xff, value[1] & 0xff, value[2] & 0xff, value[3] & 0xff);

    }
}
```


----------



## Xyz1 (2. Sep 2019)

chrism120 hat gesagt.:


> zu prüfen ob die Rechner erreichbar sind


Ab wann sind zwei Adressen für Dich erreichbar?


----------



## chrism120 (2. Sep 2019)

Wenn ich auf meinem Netz einen Rechner mit einer Adresse aus meinem "Range" finde . Ich meine hier wenn die Adressen zwischen IP1 und IP2 liegen


----------



## chrism120 (2. Sep 2019)

Tobias-nrw hat gesagt.:


> Ab wann sind zwei Adressen für Dich erreichbar?


Wenn ich auf meinem Netz einen Rechner mit einer Adresse aus meinem "Range" finde . Ich meine hier wenn die Adressen zwischen IP1 und IP2 liegen


----------



## Xyz1 (2. Sep 2019)

Deine Freunde sind hier `>=` a und `<=` b.


----------



## chrism120 (2. Sep 2019)

Tobias-nrw hat gesagt.:


> Deine Freunde sind hier `>=` a und `<=` b.


Hast Du eine Ahnung warum es nicht läuft?


----------



## Xyz1 (2. Sep 2019)

Ich hatte etwas ausprobiert allerdings die letzte Ausgabe stimmt nicht:

```
public static boolean isOnSameNet(String ip0, String ip1, String ip2) throws IOException {
	byte[] a = InetAddress.getByName(ip0).getAddress();
	byte[] b = InetAddress.getByName(ip1).getAddress();
	byte[] c = InetAddress.getByName(ip2).getAddress();
	for (int i = 0; i < a.length; i++) {
		if ((c[i] & 0xFF) > (b[i] & 0xFF) || (c[i] & 0xFF) < (a[i] & 0xFF))
			return false;
		if ((c[i] & 0xFF) >= (a[i] & 0xFF) && (c[i] & 0xFF) < (b[i] & 0xFF))
			return true;
	}

	return true;
}

public static void main(String[] args) throws IOException {
	System.out.println(isOnSameNet("255.255.255.254", "255.255.255.254", "255.255.255.254"));
	System.out.println(isOnSameNet("255.255.255.254", "255.255.255.254", "255.255.255.255"));
	System.out.println(isOnSameNet("255.254.254.254", "255.255.255.0", "255.254.255.255"));
	System.out.println(isOnSameNet("255.254.254.254", "255.255.254.0", "255.255.254.255"));
	System.out.println(isOnSameNet("0.0.1.0", "0.1.0.0", "0.0.1.0"));
	System.out.println(isOnSameNet("0.0.1.0", "0.1.0.0", "0.0.0.1"));
}
```


----------



## temi (2. Sep 2019)

Hast du mal daran gedacht eine Klasse für IPv4 Adressen (anstatt von String) zu schreiben und zu verwenden, bzw. die Klasse InetAdress zu verwenden?

Vielleicht ist das Beispiel für dich hilfreich:
https://stackoverflow.com/questions/8677707/data-type-for-storing-ip-addresses


----------



## chrism120 (2. Sep 2019)

temi hat gesagt.:


> Hast du mal daran gedacht eine Klasse für IPv4 Adressen (anstatt von String) zu schreiben und zu verwenden, bzw. die Klasse InetAdress zu verwenden?
> 
> Vielleicht ist das Beispiel für dich hilfreich:
> https://stackoverflow.com/questions/8677707/data-type-for-storing-ip-addresses


ja das habe ich gemacht. Die String sind nur diese IP-Adressen und danach verwende ich diese Adressen mit einer If-Schleife um zu wissen ob diese Adressen sind "alive" oder nicht. falls ja, listet es diese Adtressen auf. Natürlich nach einer bestimmten Zeit.

```
try {
       InetAddress ad= InetAddress.getByName(bytesToIpv4(ip1));
       count(ip1);
      
       //Erreichbarkeit prüfen
      
       if(ad.isReachable(1000)) {
       System.out.println("Die Computer mit " + ad.getHostName()+ " mit " +bytesToIpv4(ip1) + " erreichbar" );
       }
         }catch (Exception e) {}
               }
    }
```


----------



## mrBrown (2. Sep 2019)

chrism120 hat gesagt.:


> If-Schleife







__





						if-schleife.de
					





					if-schleife.de


----------



## Xyz1 (2. Sep 2019)

Tobias-nrw hat gesagt.:


> allerdings die letzte Ausgabe stimmt nicht


So geht's

```
public static boolean isOnSameNet(String ip0, String ip1, String ip2) throws IOException {
	byte[] a = InetAddress.getByName(ip0).getAddress();
	byte[] b = InetAddress.getByName(ip1).getAddress();
	byte[] c = InetAddress.getByName(ip2).getAddress();
	for (int i = 0; i < a.length; i++) {
		if ((c[i] & 0xFF) < (a[i] & 0xFF)) {
			return false;
		}
		if ((c[i] & 0xFF) != (a[i] & 0xFF))
			break;
	}
	for (int i = 0; i < a.length; i++) {
		if ((c[i] & 0xFF) > (b[i] & 0xFF)) {
			return false;
		}
		if ((c[i] & 0xFF) != (b[i] & 0xFF))
			break;
	}
	return true;
}

public static void main(String[] args) throws IOException {
	System.out.println(isOnSameNet("255.255.255.254", "255.255.255.254", "255.255.255.254"));
	System.out.println(isOnSameNet("255.255.255.254", "255.255.255.254", "255.255.255.255"));
	System.out.println(isOnSameNet("255.254.254.254", "255.255.255.0", "255.254.255.255"));
	System.out.println(isOnSameNet("255.254.254.254", "255.255.254.0", "255.255.254.255"));
	System.out.println(isOnSameNet("0.0.1.0", "0.1.0.0", "0.0.1.0"));
	System.out.println(isOnSameNet("0.0.1.0", "0.1.0.0", "0.0.0.1"));
	System.out.println(isOnSameNet("0.0.1.0", "0.1.0.0", "0.1.0.0"));
	System.out.println(isOnSameNet("0.0.1.0", "0.1.0.0", "0.0.0.1"));
}
```


Aber es wäre besser aus der IP Adresse eine Zahl zu machen.


----------



## httpdigest (2. Sep 2019)

Was soll diese Methode tun? Um zu prüfem, ob zwei IP-Adressen imselben "Subnetz" sind, müsste man die IP-Adressen mit einer Subnetz-Maske oder, im Falle von Classless Inter-Domain Routing (CIDR), mit der angegebenen Anzahl der Bits vergleichen.
Und wieso will man überhaupt _drei_ IP-Adressen prüfen? Außerdem hängt es vom konfigurierten Routing ab, ob sich zwei Adressen in unterschiedlichen Subnetzen sehen oder nicht.
Darüber hinaus, ist die Frage der "Erreichbarkeit" nicht wohldefiniert. InetAddress.isReachable() verwendet ICMP (Ping). Ein Rechner kann aber ICMP ablehnen, trotzdem aber den Port des eigentlichen Services, den man erreichen möchte, offen haben.


----------



## Xyz1 (2. Sep 2019)

Also ich hatte jetzt nur das umgesetzt , wonach er gefragt hatte... Ich denke, das ist eine Übungsaufgabe. An Subnet-Mask hatte ich auch schon gedacht.


----------

