IP auflisten

chrism120

Aktives Mitglied
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



Java:
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);

    }
}
 

chrism120

Aktives Mitglied
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
 
X

Xyz1

Gast
Ich hatte etwas ausprobiert allerdings die letzte Ausgabe stimmt nicht:
Java:
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"));
}
 

chrism120

Aktives Mitglied
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.
Java:
           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) {}
               }
    }
 
X

Xyz1

Gast
allerdings die letzte Ausgabe stimmt nicht
So geht's
Java:
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

Top Contributor
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.
 
X

Xyz1

Gast
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.
 

Ähnliche Java Themen

Neue Themen


Oben