# Netzwerk Ping falsches ergebnis



## MaxG. (5. Jul 2017)

Hi,
ich bin gerade dabei ein tool zu programmieren das alle IP Adressen im Netzwerk Anzeigen kann. Dabei verwende ich eine Schleife die alle möglichen IP Adressen durchgeht. Der Ping wird mir der klasse InetAdress durchgeführt:

```
do{
            boolean address = false;
            count ++;
           
            try {
                address = InetAddress.getByName(ip).isReachable(5000);
            } catch (IOException e) {
               
            }
           
            if(address){
                String text = results.getText();
                results.setText(text + "\n" + ip + " erreichbar");
                count = 4;
            }
```
count = Integer Variable die mit 0 Initialisiert wurde
results = ist eine TextArea aus JavaFX
ip = String Variable in der die IP Adresse steht (siehe fortfolgender Code)

Das Problem ist jetzt aber das die Klasse sagt das z.B. 192.168.178.3 erreichbar ist sie existiert in meinem Netz aber nicht. Nur bei ganz wenigen Adressen sagt er das sie nicht erreichbar sind.
Meine Frage daher: Woran liegt das und was kann ich dagegen machen?

Hier noch der ganze Code:

```
package Tools;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;

import javafx.application.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class NetworkPing extends Application {
   
    BorderPane content;
    StackPane center;
    HBox menu;
    HBox buttons;

    Label setNetwork;
    Label setSubnet;

    TextField firstOktett;
    TextField secondOktett;
    TextField thirredOktett;
    TextField fourthOktett;
    TextField subnettMask;

    TextArea results;

    ProgressBar progress;

    Button startPing;
    Button cancel;
   
    int numberof;
    int lenght = 0;
    int discount = 0;

    public void start(Stage stage) {
        content = new BorderPane();
        content.setPadding(new Insets(20, 20, 20, 10));
        menu = new HBox();
        menu.setSpacing(5);
        buttons = new HBox();
        buttons.setSpacing(5);
        buttons.setAlignment(Pos.BASELINE_RIGHT);
        center = new StackPane();
        center.setPadding(new Insets(5, 5, 5, 5));

        setNetwork = new Label("Netz indem gesucht werden soll: ");
        setSubnet = new Label("Subnet des Netz: ");
        firstOktett = new TextField();
        secondOktett = new TextField();
        thirredOktett = new TextField();
        fourthOktett = new TextField();
        subnettMask = new TextField();

        results = new TextArea();
        results.setEditable(false);
        results.setPadding(new Insets(3, 3, 3, 3));

        startPing = new Button("Ping");
        cancel = new Button("Abbrechen");
        progress = new ProgressBar();

        menu.getChildren().setAll(setNetwork, firstOktett, secondOktett, thirredOktett, fourthOktett, setSubnet,
                subnettMask);
        buttons.getChildren().addAll(cancel, startPing);
        center.getChildren().add(results);

        content.setTop(menu);
        content.setBottom(buttons);
        content.setCenter(center);

        Scene scene = new Scene(content);

        stage.setScene(scene);
        stage.setMaximized(true);
        stage.show();
        listener();
    }

    private void listener() {
        startPing.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub

                buttons.getChildren().removeAll(cancel,startPing);
                buttons.getChildren().addAll(progress,cancel,startPing);
                try {
                    startPing();
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               
            }
        });
    }

    private void startPing() throws UnknownHostException {
        int oktett1 = 0;
        int oktett2 = 0;
        int oktett3 = 0;
        int oktett4 = 0;

        try {
            if(firstOktett.equals(null)){
                oktett1 = 0;
                numberof = 255 * 255 * 255 * 255;
            }else{
                oktett1 = Integer.parseInt(firstOktett.getText());
            }
           
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Bitte Oktett 1 korekkt angeben!");
        }

        try {
            if(secondOktett.equals(null)){
                oktett2 = 0;
                numberof = 255 * 255 * 255;
            }else{
                oktett2 = Integer.parseInt(secondOktett.getText());
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Bitte Oktett 2 korekkt angeben!");
        }

        try {
            if(thirredOktett.equals(null)){
                oktett3 = 0;
            }else{
                oktett3 = Integer.parseInt(thirredOktett.getText());
                numberof = 255 * 255;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Bitte Oktett 3 korekkt angeben!");
        }

        try {
            if(fourthOktett.equals(null)){
                oktett4 = 0;
                numberof = 255;
            }else{
                oktett4 = Integer.parseInt(fourthOktett.getText());
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Bitte Oktett 4 korekkt angeben!");
        }

        if (oktett4 == 0) {
            oktett4 ++;
            oktett4(oktett1,oktett2,oktett3,oktett4);
        }
       
        if (oktett3 == 0) {
            oktett4 ++;
            oktett3(oktett1,oktett2,oktett3,oktett4);
        }
       
        if (oktett2 == 0) {
            oktett4 ++;
            oktett2(oktett1,oktett2,oktett3,oktett4);
        }
       
        if (oktett1 == 0) {
            oktett4 ++;
            oktett1(oktett1,oktett2,oktett3,oktett4);
        }
       
       

    }

    private void oktett1(int oktett1, int oktett2, int oktett3, int oktett4) {
        for(int count = oktett1; count < 255;count++){
            oktett1 = count;
            oktett2(oktett1,oktett2,oktett3,oktett4);
        }
    }

    private void oktett2(int oktett1, int oktett2, int oktett3, int oktett4) {
        for(int count = oktett2; count < 255;count++){
            oktett2 = count;
            oktett3(oktett1,oktett2,oktett3,oktett4);
        }
    }

    private void oktett3(int oktett1, int oktett2, int oktett3, int oktett4) {
        for(int count = oktett3; count < 255;count++){
            oktett3 = count;
            try {
                oktett4(oktett1,oktett2,oktett3,oktett4);
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private void oktett4(int oktett1, int oktett2, int oktett3, int oktett4) throws UnknownHostException {
        for (int count = oktett4; count < 255; count++) {

            oktett4 = count;

            String ipAddress = String.valueOf(oktett1) + "." + String.valueOf(oktett2) + "." + String.valueOf(oktett3) + "."
                    + String.valueOf(oktett4);

            loop(ipAddress);
        }
    }

    private void loop(String ip) throws UnknownHostException {
        int count = 0;
        int currentlenght = ip.length();
       
        if(currentlenght> lenght){
            lenght = currentlenght;
            discount ++;
        }
       
        int current = Integer.parseInt(ip.substring(ip.length() - discount));
        do{
            boolean address = false;
            count ++;
           
            try {
                address = InetAddress.getByName(ip).isReachable(5000);
            } catch (IOException e) {
               
            }
           
            if(address){
                String text = results.getText();
                results.setText(text + "\n" + ip + " erreichbar");
                count = 4;
            }
           
            System.out.println((address) ? ip + " Hoast erreichbar" : ip + " Host nicht erreichbar");
           
        }while(count < 4);
       
       
        progress.setProgress(current/numberof);
        buttons.requestLayout();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        launch();
    }
}
```

PS Ein weiteres Problem ist das sobald man den Button startPing aufruft öffnet sich ein Zweites Fenster und es werden die ersten 2 IP Adressen als erreichbar angezeigt dann muss das Programm erst zu ende laufen bis alles angezeigt wird.


----------



## fhoffmann (5. Jul 2017)

Du solltest den catch-Block nicht leer lassen!
Wenn bei ungültiger IP ein Fehler geworfen wird, bleibt address ggf. auf true...


----------



## MaxG. (5. Jul 2017)

Hab jetzt in den Chatch Block ein e.printstackTrace() und ein System.out.println() geschrieben, hat aber auch nichts geholfen.


----------



## mrBrown (5. Jul 2017)

fhoffmann hat gesagt.:


> Wenn bei ungültiger IP ein Fehler geworfen wird, bleibt address ggf. auf true...


Dazu müsste sie erstmal true werden, sie wird doch im gleichen Block mit false initialisiert


----------



## JuKu (15. Jul 2017)

Bist du dir sicher, dass die Adresse nicht existiert?


----------



## MaxG. (21. Jul 2017)

Ja bin ich, da sich im Netzwerk höchstens 15 Geräte befinden aber er bei über 200 Adressen true liefert


----------



## Meniskusschaden (21. Jul 2017)

MaxG. hat gesagt.:


> Das Problem ist jetzt aber das die Klasse sagt das z.B. 192.168.178.3 erreichbar ist sie existiert in meinem Netz aber nicht. Nur bei ganz wenigen Adressen sagt er das sie nicht erreichbar sind.


Ich kann das nicht reproduzieren. In meinem Netz stimmen die Ausgaben deines Programms.


MaxG. hat gesagt.:


> Ja bin ich, da sich im Netzwerk höchstens 15 Geräte befinden aber er bei über 200 Adressen true liefert


Ein Gerät kann aber viele IP-Adressen haben, deshalb ist das noch kein Beweis. Hast du denn getestet, ob die Adressen wirklich nicht erreichbar sind? Vielleicht ist ja ein Gerät fehlerhaft konfiguriert.


----------



## JuKu (22. Jul 2017)

Prüf das mal bitte mit diesem Programm nach:
https://www.heise.de/download/product/network-scanner-13270

Danach weißt du, ob es an deinem Netzwerk oder tatsächlich an deinem Code liegt.


----------

