Erreichbarkeit von IP-Adressen überprüfunen - Denkansätze

Status
Nicht offen für weitere Antworten.

simplex

Mitglied
Hallo Leute,

hoffe, dass mir bitte jemand hier ein paar Gedankenanstöße oder paar Hilfen geben kann. Ich stehe vor einer für mich fast unlösbaren Aufgabe die sich unser netter Prof. in "Einführung in die Wirtschaftsinformatik" mal wieder ausgedacht hat, ohne sich im klaren zu sein, wie weit wir eig. im Modul "Java" sind.

Hier die Aufgabe:

Übung 19.
Schreiben Sie ein Programm, um eine Liste von IP-Adressen auf Erreichbarkeit zu testen.

Sie können dazu aus dem Programm heraus wiederholt die
Anwendung "ping" starten.
In vielen Programmiersprachen wie z. B. C oder Perl steht für solche Zwecke eine Funktion system zur Verfügung.

In Java wird mit...

Code:
Process p = Runtime.getRuntime().exec(cmd);

...der Befehl im String cmd ausführen.

Die Ausgaben des Prozesse kann man nach folgendem Muster aus seinem Ausgabestrom in die Konsole kopieren:

Code:
Code:
InputStream is = p.getInputStream();
int i;
while( (i = is.read() ) > -1 ) System.out.print( (char) i );

Hinweis: Für einen besseren Ablauf sollte der InputStream in einen BufferedInputStream eingebettet werden.

----

Also, es geht hier darum, dass man eine Anzahl von IP Adressen auf deren Erreichbarkeit testen soll. D.h ich muss ein paar IP-Adressen angeben und zu denen wird dort ein "ping" durchgeführt, oder?

Nur..wie soll ich diese Adressen einlesen. Soll dies über eine TXT Datei mit IP-Adressen erfolgen, oder werden diese über die Konsole eingelesen. Ich bin eig. absolut am Ende meines Wissen und weiß nicht wie ich dies eigentlich realisieren könnte. Ich möchte hier keine Lösungen haben, sondern einfach nur ein bisschen Hilfe (Ein Ablaufplan, wie es gehen könnte etc. pp.)

Was wird dann eigentlich ausgegeben? Das, was man bei ping an sich sieht oder wie?
 
T

tuxedo

Gast
Ähm, das solltest du am besten deinen Prof Fragen. Wir können ja nicht riechen wie er's gern hätte, ob mit oder ohne GUI, ob mit oder ohne Config-File, ob mit Eingabe über die Console etc...
Wenn er dir da keine Auskunft geben kann oder will, dann wird's dir überlassen sein. Ein wenig kreativität sollte man als angehender Wirtschaftsinformatiker schon haben.

Und was ausgegeben werden soll: Gleiches spiel. Die Aufgabenstellung gibt ja schon einige Techniken vor wie man was macht: ping ausführen, ergebnis des Programmaufrufs in Java reinholen etc.
 
L

lukian

Gast
Hi,

alex0801 hat recht. Du stellst Fragen, die leider mit den gegebenen Informationen nicht zu beantworten sind. Aber meine Erfahrung ist, dass es dann ziemlicht egal ist, wie Du es machst.
Mein Vorschlag:

1. Schreibe die IPs in eine Datei. Eine IP pro Zeile.
2. Benutze in deinem Java-Programm die Klassen File, FileInputStream, BufferedReader, um die Datei einzulesen. Tipp: der BufferedReader liefert eine Methode readLine(), mit der sich sehr einfach jede Zeile einlesen lässt.
3. Benutze ArrayList (oder etwas ähnliches) um die gelesenen IPs in einer Datenstruktur zu halten.
4. In einer for-Schleife für jede IP den Prozess 'ping' mit einer IP als Argument wie in der Aufgabenstellung starten. Tipp: Du solltest mit p.waitFor() immer warten, bis der aktuelle Prozess beendet ist, bevor Du einen neuen startest. Auf Linux gibt 'ping' ausßerdem einen Rückgabewert zurück, der sich abfragen lässt. So kann man leicht feststellen, ob der Test erfolgreich war oder nicht. Bei dem Windows-Ping sollte dies allerdings auch funktionieren.
5. Falls Du wirklich den InputStream von dem Prozess abfragen willst, wie in der Aufgabenstellung vorgeschlagen, müsstest Du auch den String parsen. Das kann eine ziemlich ekelhafte Sache sein Ich würde davon abraten und es mit dem Rückgabewert in 4. versuchen.


Das sollte hoffentlich reichen. Falls nicht, einfach nochmal melden.

Gruß,
lukian
 

sliwalker

Top Contributor
lukian hat gesagt.:
Auf Linux gibt 'ping' ausßerdem einen Rückgabewert zurück, der sich abfragen lässt. So kann man leicht feststellen, ob der Test erfolgreich war oder nicht. Bei dem Windows-Ping sollte dies allerdings auch funktionieren.

Auf Windows bekommst Du einen ExitCode zurück, der nur sagt, ob der Befehl erfolgreich abgesetzt worden ist. Das hat nichts mit dem Ergebnis den eigentlichen Befehls zu tun, den Du absetzt. Also Dein exec() kann erfolgreich aufgerufen worden sein (Sprich ExitCode 0) aber der Ping hat nicht geklappt. Deswegen musst Du auf Windows die Ausgabe des process mittels InputStream einlesen und auswerten. Auswerten kann ganz simpel laufen indem Du zB. folgende nach "Antwort von" durchsuchts.

Antwort von 209.85.135.103: Bytes=32 Zeit=21ms TTL=245
Antwort von 209.85.135.103: Bytes=32 Zeit=19ms TTL=245
Antwort von 209.85.135.103: Bytes=32 Zeit=20ms TTL=245
Antwort von 209.85.135.103: Bytes=32 Zeit=20ms TTL=245


Wenn es nicht geklappt hat, bekommts halt eine andere Antwort...

greetz
SLi
 
T

tuxedo

Gast
Halte ich für ein Gerücht. Zumindest unter Windows funktioniert das hier:

pingtest.bat
Code:
@echo off
ping -n 1 %1 > null

if errorlevel 1 goto error
echo Host pingbar
goto ende

:error
echo Host nicht pingbar
:ende

C:\DOCUME~1\achr\Desktop\VLC>pingtest michgibtsgarnichtiminternet.de
Host nicht pingbar
C:\DOCUME~1\achr\Desktop\VLC>pingtest java-forum.org
Host pingbar

Unter Linux: Ich glaube mich zu erinnern, dass ich das auch schonmal in der Art erfolgreich gemacht habe. Müsst ich nochmal testen.

Und soweit ich weiß ist das Errorlevel ein Wert, den die Anwendung bestimmen kann. Dürfte demnach also nix mit "korrekt abgesetzt" zu tun haben. Aber korrigiert mich jemand bitte mit einem nachvollziehbaren Beispiel wenn ich falsch liege.

- Alex
 

simplex

Mitglied
vielen lieben dank für eure antworten! :)

ich bin jetzt soweit gekommen...

Code:
public static void main(String [] args){
        try {
            BufferedReader in = new BufferedReader(
            new FileReader("Adressen.txt"));
            String str;
            while ((str = in.readLine())!=null)
             System.out.println(str);
             in.close();
            }catch (Exception e){}
}

nun stehe ich vor dem problem, wie ich das eingelesene in einen array schreibe...die tipps von lukian sind 1A..

geht es so?

ich erzeuge ein ArrayList:
Code:
List<String> adressliste = new ArrayList<String>();

Er soll die Sachen in die "Liste" schreiben...

Code:
public static void main(String [] args){
        List<String> adressliste = new ArrayList<String>();
        
        try {
            BufferedReader in = new BufferedReader(
            new FileReader("Adressen.txt"));
            String str;
            while ((str = in.readLine())!=null)
          adressliste.add(str);
            in.close();
            }catch (Exception e){}
                      
}

falls das überhaupt so korrekt ist..
 

DP

Top Contributor
Code:
import java.net.*;

public class PingSimple
{
  public static void main( String[] args )
  {
    InetAddress iaHost = null;
    int         iPort  = 80;
    System.out.println( "\nUsage: java PingSimple host [port] \n" +
                        " e.g.: java PingSimple [url]www.Torsten-Horn.de[/url] \n" +
                        "   or: java PingSimple 1.2.3.4 80 \n" );
    try
    {
      if( 0 >= args.length )
        throw new Exception( "Parameter missing!" );
      iaHost = InetAddress.getByName( args[0] );
      if( 1 < args.length )
        iPort = Integer.parseInt( args[1] );
      long tm = System.currentTimeMillis();
      Socket so = new Socket( iaHost, iPort );
      so.close();
      tm = System.currentTimeMillis() - tm;
      System.out.println( "Connection ok (port " + iPort + ", time = " + tm + " ms). \n" +
                          "Host Address = " + iaHost.getHostAddress() + "\n" +
                          "Host Name    = " + iaHost.getHostName() );
      System.exit( 0 );
    } catch( Exception ex )
    {
      System.out.println( "Error: " + ex.getMessage() );
      System.exit( 1 );
    }
  }
}
 
T

tuxedo

Gast
Naja, das basiert eben auf der annahme dass ein bekannter Port offen sein muss. Ein "Ping" ist jedoch etwas fast gänzlich anderes.
Zumal die Aufgabenstellung ja auch schon sagt, dass exec() benutzt werden kann oder soll.

- Alex
 

simplex

Mitglied
das ist für mich schon viel zu hoch..mein gott..bis ich mal soweit bin...

hm..warum funktioniert das hier eig. nicht..ich verstehe es nicht..

Code:
public static void main(String [] args){
        List<String> adressliste = new ArrayList<String>();
        
        try {
            BufferedReader in = new BufferedReader(
            new FileReader("Adressen.txt"));
            String str;
            while ((str = in.readLine())!=null)
            adressliste.add(str);
            in.close();
            }catch (Exception e){}
            
            for (int i = 1; i<=adressliste.size(); i++){
            String ip = adressliste.get(i-1);
            System.out.println(ip);
            
            Process p = Runtime.getRuntime().exec( "ping " + ip);

            BufferedReader in = new BufferedReader(
            new InputStreamReader(p.getInputStream()) );

            for ( String s; (s = in.readLine()) != null; )
            System.out.println( s );
            
        }

enthält denn ip nicht einfach eine aktuelle ip adresse? dieser teil funktioniert ja eig, wenn ip z.b 192.168.1.1 enthält...zumindest bei meinem vorigen programm..
 

DP

Top Contributor
Code:
import java.net.*;
import java.io.*;
import java.util.*;

public class pingTest {

public static void main(String[] args) {

String ip = args[0];
String pingResult = "";

String pingCmd = "ping " + ip;

try {
          Runtime r = Runtime.getRuntime();
          Process p = r.exec(pingCmd);

          BufferedReader in = new BufferedReader(new
          InputStreamReader(p.getInputStream()));
          String inputLine;
          while ((inputLine = in.readLine()) != null) {
                    System.out.println(inputLine);
                    pingResult += inputLine;
          }
          in.close();

}
catch (Exception e) {
          System.out.println(e);
}

}

}
 

lukian

Mitglied
simplex hat gesagt.:
hm..warum funktioniert das hier eig. nicht..ich verstehe es nicht..

Die Frage ist, was für ein Fehler denn überhaupt auftaucht? Aber eigentlich sieht's ganz gut aus. Allerdings würde ich
Code:
Process p = Runtime.getRuntime().exec(new String[] {"ping", ip});
schreiben.

Gruß,
luk

@DP: :applaus: Ich verneige mich vor eurem Können, Meister...
 

simplex

Mitglied
folgenden fehler erhalte ich:

"unreported exception java.io.IOException; must be caught or declared to be thrown"

und zwar bei meiner und bei deiner "version"
 

DP

Top Contributor
ich bin ja auch der größte mit dem größten :applaus:

ne, bedank' dich bei google ;)

"unreported exception java.io.IOException; must be caught or declared to be thrown"

du musst deinen code in einen try-/catch-block tun
 

simplex

Mitglied
es hat ein "public static void main(String [] args)throws IOException gefehlt..danach ging es..

leute, ich hab solch einen respekt vor euch..wahnsinn..hoffe, ich werde auch irgendwann so weit sein wie ihr..aber dafür brauche ich bestimmt noch jahre..

also..vielen lieben dank für alles! :) danke danke danke..

simplex ist nich lukian!? wie kommst du denn darauf?
 
T

tuxedo

Gast
Sag mal: In welchem Semester bist du denn? Solche Sachen wie da oben hab ich schon im 1 oder 2ten semester gebastelt. Ist ja wirklich kein Hexenwerk.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben