Socket Socket_Programming

chrism120

Aktives Mitglied
guten tag,
ich schreibe ein kleines Programm zum Netzscan. Ich habe schon das Program geschrieben und möchte jetzt für jede Adresse im Netz die verschiedenen "offen" Porets visualizieren.
hier ist meine Code. kann jemand mir sagen was ich falsch gemacht habe?12218
 
Bitte code als text in code Tags posten.

Und dann bitte auch immer genaue Informationen mitgeben, was nicht geht.
 
Das funktioniert schon (vermutlich war das Timeout zu kurz)
Java:
import java.io.IOException;
import java.net.*;

public class Scan {
    public static void main(String[] args) {
        for (int i = 0; i < 3000; i++) {
            String ip = "127.0.0.";
            for (int j = 0; j < 255; j++) {
                String host = ip + j;
                try {
                    InetAddress addr = InetAddress.getByName(host);
                    Socket so = new Socket();
                    so.connect(new InetSocketAddress(addr, i), 1000);
                    so.close();
                    System.out.printf("%s:%d open\n", host, i);
                } catch (UnknownHostException ex) {
                    System.out.println("Unknown host: " + host);
                } catch (SocketTimeoutException | ConnectException ex) {
                    // ignore
                } catch (IOException ex) {
                    System.err.printf("An exception occurred while accessing %s:%d: %s\n", 
                            host, i, ex.getMessage());
                }
            }
        }        
    }
}
 
Das funktioniert schon (vermutlich war das Timeout zu kurz)
Java:
import java.io.IOException;
import java.net.*;

public class Scan {
    public static void main(String[] args) {
        for (int i = 0; i < 3000; i++) {
            String ip = "127.0.0.";
            for (int j = 0; j < 255; j++) {
                String host = ip + j;
                try {
                    InetAddress addr = InetAddress.getByName(host);
                    Socket so = new Socket();
                    so.connect(new InetSocketAddress(addr, i), 1000);
                    so.close();
                    System.out.printf("%s:%d open\n", host, i);
                } catch (UnknownHostException ex) {
                    System.out.println("Unknown host: " + host);
                } catch (SocketTimeoutException | ConnectException ex) {
                    // ignore
                } catch (IOException ex) {
                    System.err.printf("An exception occurred while accessing %s:%d: %s\n",
                            host, i, ex.getMessage());
                }
            }
        }       
    }
}
hallo Mihe. Sorry für die Verspätung. Ja das funktioniert. Also nur teilweise.
 
nur Programm muss 2 Funktionalitäten haben. Networkscan also fuer eine bestimmte Range (zB: 172.20.100.2-172.20.100.254). ich kann ja einen Scan durchführen. zweitens wenn ich eine Adresse von diesem Range (zB: 172.20.100.100) aussuche, musss man in der Lage sein die "opend" ports anzuzeigen.
unter ist mein Code


//Scan-Funktion und Ports
public static void Scan() {
System.out.println("*****Scan for a Host(Subnetz) : 172.20.100.0*****");
//Kleines Programm für Scann port auf seinem eigenen Computer
String IP = "172.20.100";
for (int i = 0; i <= 3000; i++) {
try {
///String IP="172.21.128.140";
// Scann this range
for (int j = 1; j < 255; j++) {
try {
String host = IP + "." + j;
InetAddress ad = InetAddress.getByName(host);
//Creation of unconnect Socket
Socket so = new Socket();
//Connect this Socket to a server with a Hostname und Timeout: And creation of a SocketAddress from a hostname an a port

so.connect(new InetSocketAddress(ad.getHostAddress(), i), 10);
// Close Socket after Scanning
so.close();
System.out.println("Port " + i + " ist open");
} catch (Exception e) {

}
}
}catch (Exception z) {

}
 
hallo Mihe. Sorry für die Verspätung. Ja das funktioniert. Also nur teilweise.
wenn ich mein Programm ausführe, krigen ich folgendes Resultat:



"C:\Program Files\Java\jdk-12\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\lib\idea_rt.jar=1464:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Nana\Downloads\IPScannerEx-master\Scan\out\production\Scan com.company.Main
**** Welche Operation durchführen ***
****1 = NetworkScan , 2 = EigentportScan und 3= für einen HostPortSan***
3
*****Scan for a Host(Subnetz) : 172.20.100.0*****
172.20.100.4
Port 21 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 22 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 80 ist open
Port 111 ist open
Port 111 ist open
Port 111 ist open
Port 111 ist open
Port 111 ist open
Port 111 ist open
Port 111 ist open
Port 139 ist open
Port 139 ist open
 
Du könntest die beiden Schleifen tauschen: äußere für IPs und innere für Ports. Und natürlich kannst du die ip mit ausgeben.

Optionen wie die Daten speichern oder so gibt es natürlich auch noch....
 
Soll das ganze nur zur Übung sein, oder hat das einen tieferen Sinn?
es hat einen tieferen Sinn. ich ahbe es als Aufgabe bei der Arbeit bekommen und der erste Schritt ist diese Operation durchzuführen und viel möchte mein Chef im Unternehmen verwendet. Der hat mir auch empholen Thread zu verwenden. ich bin noch java-Lehrling. 🙂🙂 und versuch was Schönes zu machen
 
Also als Übung ist es ok, aber wenn es um produktiven Einsatz geht, dann halte ich es für wenig sinnvoll.

Da macht der Einsatz eines Tools wie nmap deutlich mehr Sinn.
 
Also als Übung ist es ok, aber wenn es um produktiven Einsatz geht, dann halte ich es für wenig sinnvoll.

Da macht der Einsatz eines Tools wie nmap deutlich mehr Sinn.

Hallo Kneitzel,
ich die Schleifen ausgetauscht und ich kriege keine Information mehr. Allerdings habe ich geschaft für eine in Code gegebene beschtimmte Adresse die opened ports zu visualizieren. Jetzt möchte für eine Adresse, die ich die Konsole eingebe, die Ports anzeigen zu können. Ich weiß leider nicht wie ich verfahre soll.
 
Hallo Kneitzel,
ich die Schleifen ausgetauscht und ich kriege keine Information mehr. Allerdings habe ich geschaft für eine in Code gegebene beschtimmte Adresse die opened ports zu visualizieren. Jetzt möchte für eine Adresse, die ich die Konsole eingebe, die Ports anzeigen zu können. Ich weiß leider nicht wie ich verfahre soll.
 
Zeig mal Deinen Code - So Du in der inneren Schleife eine Ausgabe machst, sollte die immer noch angezeigt werden.

Aber bau das doch erst einmal mit Funktionen:
- Eine Funktion könnte eine Adresse und einen Port bekommen und genau diesen Port testen.
- Eine Funktion könnte eine Adresse und eine Port Range bekommen und dann alle Ports der Adresse testen.
- ...

Dann wird das alles auch einfacher, wenn man das ändern will.
 
Zeig mal Deinen Code - So Du in der inneren Schleife eine Ausgabe machst, sollte die immer noch angezeigt werden.

Aber bau das doch erst einmal mit Funktionen:
- Eine Funktion könnte eine Adresse und einen Port bekommen und genau diesen Port testen.
- Eine Funktion könnte eine Adresse und eine Port Range bekommen und dann alle Ports der Adresse testen.
- ...

Dann wird das alles auch einfacher, wenn man das ändern will.
this is for Eingabe an die Konsole
package com.company;
import java.io.IOException;
import java.net.*;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.logging.SocketHandler;

public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("**** Welche Operation durchführen ***");
System.out.println(" ****1 = NetworkScan , 2 = EigentportScan und 3= für einen HostPortSan***");
int c;
try {
c = s.nextInt();
if (c == 1) {
System.out.println("####Wählen sie bitte ein Subnetz aus#####");
System.out.println("1=172.20.100.0 und 2 = 172.21.128.0");
Scanner A = new Scanner(System.in);
int A1 = A.nextInt();
try {

if (A1 == 1) {
netscann();
} else if (A1 == 2) {
netscann1();
}
} catch (InputMismatchException e) {
System.out.println("Sie Haben einen " + e + " erzeugt");
}
} else if (c == 2) {
// Scan();
sca();
} else if (c == 3) {
Scan();


}
// System.out.println("Good bye Sir");
s.close();
} catch (InputMismatchException e) {
System.out.println("Falsche Eingabe " + e);
}
}
 
Dies istr für Scan
//Subnet 172.20.100.0
public static void netscann() {
// defines the Adress
String IP = "172.20.100";
//Defines the Delay
int timeout = 1000;
for (int i = 1; i <= 254; i++) {
try {
String host = IP + "." + i;
// Intance of IP Address
InetAddress ad = InetAddress.getByName(host);
// Erreichbarkeit der Hosts laut Timeout
if (ad.isReachable(timeout))
System.out.println("The Computer " + ad.getCanonicalHostName() + " with this address " + host + " ist reachable");
} catch (Exception e) {
}
 
dies ist für scan dasss ich gebastelt habe
/Scan-Funktion und Ports
public static void Scan() {
System.out.println("*****Scan for a Host(Subnetz) : 172.20.100.0*****");
//Kleines Programm für Scann port auf seinem eigenen Computer
String IP = "172.20.100";
for (int j = 1; j <= 254; j++) {
try {
///String IP="172.21.128.140";
// Scann this range
for (int i = 1; i < 3000; i++) {
try {
String host = IP + "." + j;
InetAddress ad = InetAddress.getByName(host);
//Creation of unconnect Socket
Socket so = new Socket();
//Connect this Socket to a server with a Hostname und Timeout: And creation of a SocketAddress from a hostname an a port

so.connect(new InetSocketAddress(ad.getHostAddress(), i), 1000);
// Close Socket after Scanning
so.close();
System.out.println("Port " + i + " ist open");
} catch (Exception e) {

}
}
}catch (Exception z) {

}
 
Java:
package com.company;
import java.io.IOException;
import java.net.*;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.logging.SocketHandler;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("**** Welche Operation durchführen ***");
        System.out.println(" ****1 = NetworkScan  , 2 = EigentportScan  und 3= für einen HostPortSan***");
        int c;
        try {
            c = s.nextInt();
            if (c == 1) {
                System.out.println("####Wählen sie bitte ein Subnetz aus#####");
                System.out.println("1=172.20.100.0 und 2 = 172.21.128.0");
                Scanner A = new Scanner(System.in);
                int A1 = A.nextInt();
                try {

                    if (A1 == 1) {
                        netscann();
                    } else if (A1 == 2) {
                        netscann1();
                    }
                } catch (InputMismatchException e) {
                    System.out.println("Sie Haben einen " + e + " erzeugt");
                }
            } else if (c == 2) {
               // Scan();
                sca();
            } else if (c == 3) {
                Scan();


            }
            //   System.out.println("Good bye Sir");
            s.close();
        } catch (InputMismatchException e) {
            System.out.println("Falsche Eingabe " + e);
        }
    }

    //Subnet 172.20.100.0
    public static void netscann() {
// defines the Adress
        String IP = "172.20.100";
        //Defines the Delay
        int timeout = 1000;
        for (int i = 1; i <= 254; i++) {
            try {
                String host = IP + "." + i;
                // Intance of IP Address
                InetAddress ad = InetAddress.getByName(host);
                // Erreichbarkeit der Hosts laut Timeout
                if (ad.isReachable(timeout))
                    System.out.println("The  Computer " + ad.getCanonicalHostName() + " with this address " + host + " ist reachable");
            } catch (Exception e) {
            }
        }
    }

    public static void netscann1() {
        String Ip = "172.21.128";
        int timeout = 1000;
        for (int i = 1; i < 255; i++) {
            try {
                String host = Ip + "." + i;
                InetAddress ad = InetAddress.getByName(host);
                if (ad.isReachable(timeout))
                    System.out.println("Der Computer " + ad.getHostAddress() + " mit IP Adressse " + host + " ist erreichbar");
            } catch (Exception e) {
            }

        }
    }

//Scan-Funktion und Ports
    public static void Scan() {
        System.out.println("*****Scan for a Host(Subnetz) : 172.20.100.0*****");
//Kleines Programm für Scann port auf seinem eigenen Computer
        String IP = "172.20.100";
        for (int i = 0; i <= 3000; i++) {
            try {
                ///String IP="172.21.128.140";
                // Scann this range
                for (int j = 1; j < 255; j++) {
                    try {
                        String host = IP + "." + j;
                        InetAddress ad = InetAddress.getByName(host);
                        //Creation of unconnect Socket
                        Socket so = new Socket();
      //Connect this Socket to a server with a Hostname und Timeout: And creation of a SocketAddress from a hostname an a port

                        so.connect(new InetSocketAddress(ad.getHostAddress(), i), 1000);
                        // Close Socket after Scanning
                        so.close();
                        System.out.println("Port " + i + " ist open");
                    } catch (Exception e) {

                    }
                }
            }catch (Exception z) {

            }
        }
    }

    }
 
Also gut, wo fängt man jetzt an?

a) Dir ist bekannt, dass Methoden auch Parameter haben können? netscann und netscann1 sind ja eigentlich gleich - nur die Variable IP/Ip ist unterschiedlich und die Kommentare natürlich ... Warum also nicht diese lokale Variable zu einem Parameter machen und dann die Funktion mit Parameter aufrufen?

b) Die scan() Methode hat immer noch als äußere Schleife die Ports und als innere die IP. Dachte, das wolltest Du umdrehen (So hatte ich Dich zumindest verstanden, weil Du dann pro Rechner die offenen Ports ausgeben würdest....)

Und dazu war doch die Idee, die ich Dir gegeben hatte, dass Du das weiter in Methoden unterteilst.

Dann finde ich es schon heftig, wenn ich catch (Exception e) sehe. Es mag ja ok sein, eine bestimmte Exception zu fangen weil die Connection nicht erfolgreich ist, aber so alle Exceptions fangen und da dann nichts zu machen, ist schon hart. Und das innere catch dürfte alles fangen - da ist das äußere catch doch unnötig. Oder wo erwartest Du eine Exception, die da gefangen werden soll?
 
Also gut, wo fängt man jetzt an?

a) Dir ist bekannt, dass Methoden auch Parameter haben können? netscann und netscann1 sind ja eigentlich gleich - nur die Variable IP/Ip ist unterschiedlich und die Kommentare natürlich ... Warum also nicht diese lokale Variable zu einem Parameter machen und dann die Funktion mit Parameter aufrufen?

b) Die scan() Methode hat immer noch als äußere Schleife die Ports und als innere die IP. Dachte, das wolltest Du umdrehen (So hatte ich Dich zumindest verstanden, weil Du dann pro Rechner die offenen Ports ausgeben würdest....)

Und dazu war doch die Idee, die ich Dir gegeben hatte, dass Du das weiter in Methoden unterteilst.

Dann finde ich es schon heftig, wenn ich catch (Exception e) sehe. Es mag ja ok sein, eine bestimmte Exception zu fangen weil die Connection nicht erfolgreich ist, aber so alle Exceptions fangen und da dann nichts zu machen, ist schon hart. Und das innere catch dürfte alles fangen - da ist das äußere catch doch unnötig. Oder wo erwartest Du eine Exception, die da gefangen werden soll?
hallo , ja die Methode netsacnn1 und netscann sind für zwei verschiedene Subnetze. Ich nehme deine Empfehlung und mache so. Sorry ich bin noch Lehring.
b) ich habe die beiden Schleifen umgedreht aber habe keine Information bekommen.
 
zu a) Das war nicht als Vorwurf gemeint. Ich versuche wirklich nur freundlich nach zu haken, um dann ggf. etwas auszuführen oder zu entsprechender Dokumentation zu verlinken. Das soll nur dazu dienen, dass Du weiter kommst. Daher toll, dass Du es einmal versuchst entsprechend umzustellen.

zu b) Da würde mich dann der Code interessieren, der eben nichts mehr ausgeben hat. Dann können wir einmal schauen, wo man etwas verändern müsste, damit Du wieder eine Sinnvolle Ausgabe bekommst.
 
zu a) Das war nicht als Vorwurf gemeint. Ich versuche wirklich nur freundlich nach zu haken, um dann ggf. etwas auszuführen oder zu entsprechender Dokumentation zu verlinken. Das soll nur dazu dienen, dass Du weiter kommst. Daher toll, dass Du es einmal versuchst entsprechend umzustellen.

zu b) Da würde mich dann der Code interessieren, der eben nichts mehr ausgeben hat. Dann können wir einmal schauen, wo man etwas verändern müsste, damit Du wieder eine Sinnvolle Ausgabe bekommst.
ok Alles Gut. Danke
 
Wäre halt schön gewesen, wenn Du Deinen Code einmal gezeigt hättest... ungetestet wäre eine umgestellte Version:
Java:
    public static void Scan() {
        System.out.println("*****Scan for a Host(Subnetz) : 172.20.100.0*****");
        String IP = "172.20.100";
        for (int j = 1; j < 255; j++) {
            String host = IP + "." + j;
            System.out.println("Scanne: " + host);
            for (int i = 0; i <= 3000; i++) {
                try {
                    InetAddress ad = InetAddress.getByName(host);
                    Socket so = new Socket();
                    so.connect(new InetSocketAddress(ad.getHostAddress(), i), 1000);
                    so.close();
                    System.out.println("Port " + i + " ist open");
                } catch (Exception e) {
                    // Ports seems to be closed, expected exception so no output!
                }
            }
        }
    }
Wie Du erkennen kannst habe ich:
a) die beiden for schleifen 1:1 getauscht.
b) die Variable host gehörte zu der Schleife, daher habe ich das auch mi hochgenommen und eine Ausgabe gemacht.
c) ein unnötiges try / catch habe ich entfernt
d) leerer catch Block geht nicht, daher wenigstens ein Kommentar. Statt Exception sollte man da aber die spezifischen Exceptions nehmen meine ich, aber die habe ich mir jetzt nicht rausgesucht.

Nun kannst Du das testen und dann auch vergleichen mit dem, was Du hattest oder mit dem, was Du anders gemacht hast.
 
Wäre halt schön gewesen, wenn Du Deinen Code einmal gezeigt hättest... ungetestet wäre eine umgestellte Version:
Java:
    public static void Scan() {
        System.out.println("*****Scan for a Host(Subnetz) : 172.20.100.0*****");
        String IP = "172.20.100";
        for (int j = 1; j < 255; j++) {
            String host = IP + "." + j;
            System.out.println("Scanne: " + host);
            for (int i = 0; i <= 3000; i++) {
                try {
                    InetAddress ad = InetAddress.getByName(host);
                    Socket so = new Socket();
                    so.connect(new InetSocketAddress(ad.getHostAddress(), i), 1000);
                    so.close();
                    System.out.println("Port " + i + " ist open");
                } catch (Exception e) {
                    // Ports seems to be closed, expected exception so no output!
                }
            }
        }
    }
Wie Du erkennen kannst habe ich:
a) die beiden for schleifen 1:1 getauscht.
b) die Variable host gehörte zu der Schleife, daher habe ich das auch mi hochgenommen und eine Ausgabe gemacht.
c) ein unnötiges try / catch habe ich entfernt
d) leerer catch Block geht nicht, daher wenigstens ein Kommentar. Statt Exception sollte man da aber die spezifischen Exceptions nehmen meine ich, aber die habe ich mir jetzt nicht rausgesucht.

Nun kannst Du das testen und dann auch vergleichen mit dem, was Du hattest oder mit dem, was Du anders gemacht hast.
ok ich teste und sage Dir Bescheid
 
Bei jedem Verbindungsversuch zu einem Port wartet das Programm 1 Sekunde.
Und du versuchst es mit 3.000 Ports - das ergibt 50 Minuten pro IP-Adresse.
Und das willst du für 255 IP-Adressen durchführen ...
 
Java:
public static void Hostportscan() {
        System.out.println("++opened Ports on my computer++");
        for (int i = 1; i<3000; i++)
        //Creation of unconnected Socket
        {
            Socket s = new Socket();
            try{
             s.connect(new InetSocketAddress("172.21.128.140",i),10);
             s.close();
             System.out.println("The Opened port ist " + i);
            }
            catch (IOException p) {}
            }
        }
Beispielsweise ,wenn ich im Code eine IP-Adresse ("172.21.128.140") eingebe , kriege ich alle Informationnen in Bezug auf die opened Ports. Jetzt will ich die Adressen nicht mehr im Code schreiben sondern in der Konsole. wenn ich zB "3" in der Konsole aussuche und die IP Adressse eingebe , soll ich in der Lage sein diese Informationen wie oben erhalten. Wie kann ich tun ?
 
Zuletzt bearbeitet:
Du nutzt ja schon den Scanner. (Den solltest Du aber nur einmal erzeugen und dann überall nutzen - das nur als Randbemerkung).

Du kannst mit dem Scanner auch generell Eingaben entgegen nehmen - Du könntest also darum bitten, dass jemand das Netz eingibt (IP ohne 4. Teil) und das dann nutzen.
Prüfen kannst Du die Eingabe über reguläre Ausdrücke, also z.B. "\d*\.\d*\.\d*" sollt auf zahl.zahl.zahl prüfen. Noch nicht perfekt, aber ein erster Anfang (Online findest Du bestimmt auch noch deutlich besseres, so dass jede Zahl <= 255 sein muss und so ... Könnte man hier auch noch bauen, aber das sollte als erster Ansatz schon reichen!)
 

Zurück
Oben