scan remote UDP port

wh4tup

Mitglied
hi,

ich hab ne methode die überprüfen soll of ein ziel system an einem bestimmten port "lauscht". das zielsystem ist ein sipclient der wahlweise auf port 5060 UDP oder TCP lauscht.

die überprüfung soll für tcp und udp funktionieren. mit tcp klappts das bereits. bei udp lässt sich scheinbar ein datagramsocket aufbauen auch wenn das zielsystem gar nicht rennt.

host="10.0.0.50"
port="5060"

Code:
DatagramSocket dSocket = null;
			try {
				dSocket = new DatagramSocket();
				InetAddress address = InetAddress.getByName(host);
				dSocket.setSoTimeout(5000);
				dSocket.connect(new InetSocketAddress(address, Integer.valueOf(port))) ;
				return true;
			} catch (SocketException e) {
				return false;
			} catch (UnknownHostException e) {
				return false;
			}  finally {
	            if (dSocket != null) {
	                dSocket.close();
	            }
	        }

die connect methode der klasse DatagramSocket versteh ich nicht. es wird keine exception geworfen obwohl der server nicht rennt. bei tcp wird hier eine IOException geworfen

laut api beschreibung müsste eine SocketException geworfen werden:

=>SocketException - if the connect fails

DatagramSocket (Java 2 Platform SE v1.4.2)
habs auch schon mit der send() method versucht. leider auch ohne erfolg.
 
Udp ist verbindungslos, die ist nur für security manager soweit ich weiß (bei applets zb). Einfach die packete richtung Server rausballern und hoffen das eine antwort kommt.
 
Dann lies doch mal deinen genannten Link:

If the remote destination to which the socket is connected does not exist, or is otherwise unreachable, and if an ICMP destination unreachable packet has been received for that address, then a subsequent call to send or receive may throw a PortUnreachableException. Note, there is no guarantee that the exception will be thrown.

Wichtig ist hier eben dass der Zielhost oder Router, wenn er existiert, eine "Destination unreachable" sendet. Wenn du direkt im selben Netz bist dann wird direkt kommuniziert. Bedeutet wenn der Rechner garnicht an ist, dann wird auch niemand das Paket senden.
 
bei udp lässt sich scheinbar ein datagramsocket aufbauen auch wenn das zielsystem gar nicht rennt.
weil es bei UDP keinen im Netzwerk interessiert ob das Paket überhaupt von Dir losgeschickt wurde oder Deine Netzwerkkarte schon einen Fehler gemacht hat ... wenn Deine Netzwerkkarte keinen Fehler gemacht hat, dann wirst Du keine antwort bekommen ob da überhaupt jemand lauscht ... Dein Paket darf ungesehen im Netzrauschen verschwinden ... den Port-Scan über UDP wirst Du nicht realisieren können
 
Zumindest nicht zuverlässig,
es wird nicht funktionieren

aber wenn man doch eine Antwort bekommt kann man zumindest sicher sagen, das da was ist.
dazu musst Du aber das Protokoll kennen was hinter diesem Port "versteckt" ist ... kennst Du das Protokoll nicht, dann wirst Du auch keine Antwort erhalten - denn der UDP-port (bzw. das Programm) muss bei einem falschen Paket nicht antworten ... Du bekommst ja noch nicht mal (wie bei TCP) eine Bestätigung das das Programm Dein Paket erhalten hat (bzw. das da überhaupt jemand auf dem Port lauscht)
 
ja wird nichtts nützen. primär gings mir ja darum möglichst schnell zu überprüfen ob ein zielsystem antwortet. das unteriegenden api wirft halt erst nach einiger zeit - oft weit mehr als 5 sec - einen TimeOutEvent an mein app.

danke für eure hilfe
 

Neue Themen


Zurück
Oben