UDP Port bestimmen | Windows, MAC, Linux...

Dit_

Bekanntes Mitglied
Hallo,

ist es möglich einen für UDP bestimmten Port festzustellen und zwar mit einer Methode die auf verschiedenen OS funktionieren würde?

Ich brauche das für eine ProjektArbeit, da muss man in einer XML-Datei den Port angeben, manchmal weiss aber der Benutzer nicht welcher port im Netz (einer Schule oder Organisation) freigegeben ist. Ich weiss man kann RZ fragen, aber vielleicht kann man einfach eine Suchfunktion anbieten :)


Habe im Netz folgende Methode gefunden

Java:
public static void main(String[] args) {
		for (int port = 1024; port <= 65535; port++) {
			try {
				DatagramSocket server = new DatagramSocket(port);
				server.close();
				System.out.println("OK: " + port);
			} catch (SocketException ex) {
				System.out.println("There is a server on port " + port + ".");
			}
		}
	}

Was sagen die Profis?

Danke schon mal
 

kay73

Bekanntes Mitglied
ist es möglich einen für UDP bestimmten Port festzustellen...
Nicht sehr sauber. Portscanner beschießen eine Zieladresse mit Paketen auf allen Ports und testen, ob eventuell eingehende Pakete zu einem versandten Paket passen.

In Deinem Fall wäre das nicht besonders "höflich" und auch nicht 100%-ig sicher, da das "U" in UDP nun mal für unreliable steht. Wenn Du das Antwortverhalten und Format der Pakete kennst, ließe sich vielleicht was machen, was einigermaßen funktioniert. Der Code da unten scheint ganz nett zu klappen:

Code:
PortscanDemo
kann einen laufenden DNS Server erkennen. Für Deine Zwecke kannst Du die Klasse
Code:
DNSSinglePortScanner
Vorlage zu verwenden; musst nur
  • Den Konstruktor überladen
  • Code:
    genUDPPayload()
    überladen; gibt die byte Vorlage für die UDP Pakete zurück.
  • Code:
    verifyReturnedPayload()
    überladen; testet ob ein empfangenes Paket ein gültiges Antwortpaket sein kann.

Der Code der Basisklasse ist an etlichen Stellen verbesserungswürdig, z. B. kann man
  • den/die Timeout(s) schöner implementieren
  • Exceptions besser behandeln
  • das blocking fixen, da
    Code:
    receive()
    ständig
    Code:
    null
    -s zutückliefert. (Keine Ahnung wieso...)
  • eine Abbruchfunktion für den Scan einbauen, anstatt nach 10 Sekunden automatisch zu sterben
  • intervallartiges Senden/Empfangen von Paketen, Z. B. nicht mehr als 100 auf einmal, damit die Firewalls nicht denken, man wolle eine DoS-Attacke starten, usw...

Java:
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

interface PortScanner {
	static final int INVALID_PORT = -1;
	int scan() throws IOException;
};

abstract class AbstractUDPSinglePortScanner implements PortScanner {

	private final int portMin;
	private final int portMax;
	private final InetAddress dest;
	
	private static final int TIMEOUT_SECONDS=10;

	protected abstract byte[] genUDPPayload();

	protected abstract boolean verifyReturnedPayload(byte[] payload);

	protected AbstractUDPSinglePortScanner(String hostName, int portMin, int portMax)
			throws IOException {

		this.portMin = Math.min(portMin, portMax);
		this.portMax = Math.max(portMin, portMax);

		dest = Inet4Address.getByName(hostName);
	}

	@Override
	public final int scan() throws IOException {

		final DatagramChannel ch = DatagramChannel.open();
		ch.configureBlocking(true);

		final ExecutorService exs = Executors.newSingleThreadExecutor(); 
		final Future<Integer> f = exs.submit(
			new Callable<Integer>() {

				@Override
				public Integer call() throws Exception {
					final byte[] buffer = new byte[1024];
					final ByteBuffer bb = ByteBuffer.wrap(buffer);
					
					while (true) {
						final SocketAddress soa = ch.receive(bb);

						if (soa != null) {
							bb.flip();

							if (soa instanceof InetSocketAddress) {
								final InetSocketAddress isa = (InetSocketAddress) soa;
								if (isa.getAddress().equals(dest)
										&& verifyReturnedPayload(buffer)) {
									return isa.getPort();
								}
							}
						}
					}
				}
			});
		exs.shutdown();
		
		for (int port = portMin; port <= portMax; port++) {
			ch.send(ByteBuffer.wrap(this.genUDPPayload()), 
				new InetSocketAddress(dest, port));
		}

		try {
			if(!exs.awaitTermination(TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
				f.cancel(true);
				return PortScanner.INVALID_PORT;
			} 
			
			return f.get();
		} catch (InterruptedException e) {
			return PortScanner.INVALID_PORT;
		} catch (ExecutionException e) {
			return PortScanner.INVALID_PORT;
		}
	}
}

class DNSSinglePortScanner extends AbstractUDPSinglePortScanner {
	
	private static final byte dns_google_de[] = { 
		0x7d, (byte) 0x9f, 0x01, 0x00, 0x00,
		0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
		0x00, 0x03, 0x77, 0x77, 0x77, 0x06, 
		0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
		0x02, 0x64, 0x65, 0x00, 0x00, 0x01, 
		0x00, 0x01 };

	public DNSSinglePortScanner(String hostName, int portMin, int portMax)
			throws IOException {
		super(hostName, portMin, portMax);
	}

	@Override
	protected byte[] genUDPPayload() {		
		return dns_google_de;
	}

	@Override
	protected boolean verifyReturnedPayload(byte[] payload) {
		return true;
	}	
}

public class PortscanDemo {

	public static void main(String[] args) throws IOException {
		
		final PortScanner ps = new DNSSinglePortScanner("208.67.222.222", 20, 70);
		final int port = ps.scan();
		System.out.println("DNS auf port: "+(port != PortScanner.INVALID_PORT ? port : "(nicht gefunden)"));
	}
}

Habe im Netz folgende Methode gefunden
Das hilft Dir nicht weiter. Hier wird getestet, ob auf Deiner eigenen Maschine ein Prozess auf einem Port lauscht, wenn das berhaupt so klappt.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
feuervogel Sockets - Lokalen Port aber nicht IP bestimmen Netzwerkprogrammierung 3
JavaDevOp Socket Status von UDP-Port prüfen (PortUnreachableException funktioniert nicht?) Netzwerkprogrammierung 32
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
T multithreaded multiport socketListener beendet TCP-Port-Listening Netzwerkprogrammierung 16
C Proxy Server - Antwort auf welchem Port Netzwerkprogrammierung 1
precoc Port Listener Netzwerkprogrammierung 2
T Port forwarding Netzwerkprogrammierung 11
Rudolf Socket An welchen Port sendet ein Mailserver zu einem anderen Mailserver Netzwerkprogrammierung 8
C Socket Connection refused bei Internetverbindung - Welcher Port? Netzwerkprogrammierung 5
S Port abhören Netzwerkprogrammierung 11
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
Dit_ UDP Port testen | Ping Google? Netzwerkprogrammierung 7
J Port lauschen Netzwerkprogrammierung 2
D Weiterer Thread auf Port 843 horcht Netzwerkprogrammierung 7
H Mysql port forwarding Netzwerkprogrammierung 5
J UDP port packete lesen,wenn dieser besetzt ist Netzwerkprogrammierung 3
T Java Mail port ändern Netzwerkprogrammierung 4
1 Socket Immer offener Port? Netzwerkprogrammierung 11
R wie prüfe ich ob ein port frei is ? Netzwerkprogrammierung 7
S Port auf einer bestimmten IP-Adresse auslesen? Netzwerkprogrammierung 6
X Port scannen/schicken Netzwerkprogrammierung 4
W scan remote UDP port Netzwerkprogrammierung 6
M Socket Herausfinden ob server auf port läuft Netzwerkprogrammierung 8
F UDP Receive und Send am gleichen Port Netzwerkprogrammierung 3
G Port freigeben Netzwerkprogrammierung 3
P Sockets +Port Forwarding = Chaos Netzwerkprogrammierung 4
J GSM Modem an Serial Port ansteuern (AT commands) Netzwerkprogrammierung 2
T Server ohne Port Netzwerkprogrammierung 4
Schandro Herausfinden ob hinter einem Port bereits ein ServerSocket steckt Netzwerkprogrammierung 2
ABstraCT Applet multipler port Zugriff möglich ? Netzwerkprogrammierung 5
ABstraCT Telnet port Zugriff problem (public IP) Netzwerkprogrammierung 12
T ohne Port Freigabe. Netzwerkprogrammierung 6
K Problem mit Com-Port-Komunikation Netzwerkprogrammierung 57
G "Port already in use" RMI über SSL Netzwerkprogrammierung 9
S port lauschen Netzwerkprogrammierung 2
G port scanner Netzwerkprogrammierung 6
S Port mithören Netzwerkprogrammierung 9
P jakarta.HttpClient: Port bei GetMethod angeben Netzwerkprogrammierung 3
A port noch belegt Netzwerkprogrammierung 3
K Port 13 nur einmal abfragbar? Netzwerkprogrammierung 2
R Problem mit mehreren Anfragen auf demselben Port Netzwerkprogrammierung 2
TRunKX Ein Port mehrere Verbindungen? Netzwerkprogrammierung 7
H Port abhören Netzwerkprogrammierung 3
F freien Port finden Netzwerkprogrammierung 7
S GEHT DAS? - Nur eine Frage! (Printer Port direkt ansteuern?) Netzwerkprogrammierung 4
T Kann man jeden Port für Programm verwenden? Netzwerkprogrammierung 2
T PORT 80 überwachen Netzwerkprogrammierung 12
G an port lauschen Netzwerkprogrammierung 10
K nicht physikalische com port ansprechen ? Netzwerkprogrammierung 3
S SSLSocketFactory.createSocket(String hostname, int port),wo? Netzwerkprogrammierung 5
G Port belegt nach Server restart Netzwerkprogrammierung 5
R Port trotz aktiver Firewall nutzen ! Netzwerkprogrammierung 9
E Socket Outputstream - chunks groeße bestimmen. Netzwerkprogrammierung 3
S Bestimmen der aktiven Netzwerkverbindung Netzwerkprogrammierung 4
B Lokale IP Adresse bestimmen Netzwerkprogrammierung 12
O Interface bestimmen Netzwerkprogrammierung 7
L Dateninhalt im IP/TCP Packet genau bestimmen Netzwerkprogrammierung 3
P Zeit zwischen mehreren Client log-ins bestimmen. Netzwerkprogrammierung 2
C Prozess-ID (PID) bestimmen Netzwerkprogrammierung 12
windl Windows vs Linux Netzwerkprogrammierung 11
X Mit Java eine Applikation auf einem anderen Windows Rechner (Windows Server 2008) starten Netzwerkprogrammierung 1
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
T Windows-Anmeldung weiterreichen? Netzwerkprogrammierung 4
J Eclipse: Windows-Dienst auf fremden Host aktivieren Netzwerkprogrammierung 14
S soap kann nicht zu 127.0.0.1:8090 unter Windows verbinden Netzwerkprogrammierung 2
B Die IPv4 Einstellungen ändern (Windows 7) Netzwerkprogrammierung 9
N Socket geht auf Windows, aber auf Mac nicht ? Netzwerkprogrammierung 3
aze JPCap unter Windows 7(64 Bit) Netzwerkprogrammierung 6
J Windows Unix remote Netzwerkprogrammierung 2
C SingleSignOn auf Client mittels Windows Credentials Netzwerkprogrammierung 11
multiholle RMI Verbindung Linux <-> Windows Netzwerkprogrammierung 4
T RMI delay windows(client) <-> linux(server) Netzwerkprogrammierung 11
DeviAn Über ein Linux Server ein Windows Server nach einer File fragen Netzwerkprogrammierung 6
W Terminal-Server (Windows 2003) und Java Netzwerkprogrammierung 9
Q Datein von Windows nach Mac senden Netzwerkprogrammierung 4
L RMI Programm beendet ohne Fehler sofort nach Start (Windows 2000) Netzwerkprogrammierung 7
KNeuhaus (Windows) Authentication VON einer Java-App aus. Netzwerkprogrammierung 2
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
G Windows-Verbindungen Netzwerkprogrammierung 4
K Server Client läuft in Windows allerdings nicht in Linux Netzwerkprogrammierung 9
K Windows TCP/IP Einstellungen ändern Netzwerkprogrammierung 4
B Internetverbindung prüfen unter Windows Netzwerkprogrammierung 1
H freigabe - unterschiedliche pfade unter linux und windows Netzwerkprogrammierung 7
S Windows-Share? Netzwerkprogrammierung 2
D Anmelden an einer Windows-Domäne Netzwerkprogrammierung 2
G Ich krieg bei mir zuhause nichts auf die Reihe(Windows XP) Netzwerkprogrammierung 8
C Windows-Username sicher einlesen Netzwerkprogrammierung 11
S Unix Datei vom Server nach Windows übertragen Netzwerkprogrammierung 8
G Update - Funktionalität wie Windows Update Netzwerkprogrammierung 11
G Java und Netzwerkumgebung von Windows Netzwerkprogrammierung 5
R PID's auf remote PC unter Windows herrausfinden Netzwerkprogrammierung 2
M IP Adressen auslesen und in Windows/Linux übergeben Netzwerkprogrammierung 5
M Windows NT Domainnamen abfragen Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben