# scan remote UDP port



## wh4tup (6. Feb 2010)

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"


```
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.


----------



## Empire Phoenix (6. Feb 2010)

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.


----------



## HoaX (6. Feb 2010)

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.


----------



## Gast2 (6. Feb 2010)

wh4tup hat gesagt.:


> 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


----------



## Empire Phoenix (7. Feb 2010)

Zumindest nicht zuverlässig, aber wenn man doch eine Antwort bekommt kann man zumindest sicher sagen, das da was ist.


----------



## Gast2 (7. Feb 2010)

Empire Phoenix hat gesagt.:


> 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)


----------



## wh4tup (7. Feb 2010)

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


----------

