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.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()); } } } } }
wenn ich mein Programm ausführe, krigen ich folgendes Resultat:hallo Mihe. Sorry für die Verspätung. Ja das funktioniert. Also nur teilweise.
ok danke . mache ich und sag dir Bescheid.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....
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.Soll das ganze nur zur Übung sein, oder hat das einen tieferen 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.
this is for Eingabe an die KonsoleZeig 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.
Hallo, Ok verstandenMoin,
nutze doch bitte die Code-Tags!
Es erhöht die Chance, dass sich das einer ansieht nicht unerheblich!
VG Klaus
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) {
}
}
}
}
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.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 ichcatch (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?
ok Alles Gut. Dankezu 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.
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!
}
}
}
}
ok ich teste und sage Dir BescheidWäre halt schön gewesen, wenn Du Deinen Code einmal gezeigt hättest... ungetestet wäre eine umgestellte Version:
Wie Du erkennen kannst habe ich: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! } } } }
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.
das bedeutet , ich kann einfach das " timeout" verkleinert oder ?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 ...
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) {}
}
}