# Socket liefert leere IP-Nummern



## Andi_CH (31. Mrz 2011)

Von einem Server habe ich erstaunliche Einträge im log gefunden.
Lässt sich das unterschiedliche Verhalten erklären?

Zugriffe von anderen Rechnern oder vom lokalen aus über die IP-Nummer geben einen korrekten output.

z.B. so:

```
Remote IP addr     = /127.0.0.1
Remote port        = 49167
Local IP addr      = /127.0.0.1
Local port         = 8080
Local socket addr  = /127.0.0.1:8080
```

Nur wenn der Zugriff über den Namen localhost erfolgt kommt:

```
Remote IP addr     = /0:0:0:0:0:0:0:1
Remote port        = 49165
Local IP addr      = 0.0.0.0/0.0.0.0
Local port         = 8080
Local socket addr  = 0.0.0.0/0.0.0.0:8080
```

Sogar die lokale Adresse ist 0 ???:L

Codeschnipsel:

```
Socket client = s.accept();
	InetAddress rina = client.getInetAddress();
	InetAddress lina = client.getLocalAddress();
	int lp = client.getLocalPort();
	SocketAddress sa = client.getLocalSocketAddress();
	int rp = client.getPort();

	System.out.println("Request");
	System.out.println("Remote IP addr     = " + rina);
	System.out.println("Remote port        = " + rp);
	System.out.println("Local IP addr      = " + lina);
	System.out.println("Local port         = " + lp);
	System.out.println("Local socket addr  = " + sa);
```


----------



## XHelp (31. Mrz 2011)

Wie initialisierst du 
	
	
	
	





```
s
```
 bzw. an was bindest du es?


----------



## Andi_CH (31. Mrz 2011)

Grundsätzlich läuft alles, denn eigentlich greift man da nie vom localhost aus zu, ausser wenn man testet.

Interessant ist ja nur, dass sich das anders verhält wenn der request über den Namen kommt.

EDIT: Was für ein Idi.. Mechanismus schreibt mir da die URL-Tags hinein auch wenn ich das NICHT will? 
Domain ist reserviert  vs  Domain ist reserviert
also da steht 

http : // localhost : 8080    vs     http : // 127.0.0.1 : 8080

Hier das KSKB ;-)


```
import java.io.IOException;
import java.io.PrintWriter;
import java.net.*;

public class ServerVersuch {

	public ServerVersuch() throws Exception {
		final int socket = 8080;
		ServerSocket s = null;
		try {
			s = new ServerSocket(socket);
			System.out.println("Server running on " + socket + "...");
		} catch (java.net.BindException e) {
			System.err.println("Can't start server. Port " + socket + " is already in use.\nClose the previously running server to free the Port again.");
		}
		while (true) {
			try {
				Socket client = s.accept();
				InetAddress rina = client.getInetAddress();
				InetAddress lina = client.getLocalAddress();
				int lp = client.getLocalPort();
				SocketAddress sa = client.getLocalSocketAddress();
				int rp = client.getPort();

				System.out.println("Request");
				System.out.println("Remote IP addr     = " + rina);
				System.out.println("Remote port        = " + rp);
				System.out.println("Local IP addr      = " + lina);
				System.out.println("Local port         = " + lp);
				System.out.println("Local socket addr  = " + sa);

				TestThread c = new TestThread(client);
				c.start();
			} catch (java.lang.NullPointerException e) {
				System.err.println("Exiting...");
				break;
			}
		}
	}

	public static void main(String args[]) throws Exception {
		@SuppressWarnings("unused")
		TimeServer server = new TimeServer();
	}
}

class TestThread extends Thread {
	private Socket outputS;

	public TestThread(Socket s) {
		outputS = s;
	}

	public void run() {
		try {
			PrintWriter pout = new PrintWriter(outputS.getOutputStream(), true);
			System.out.println("Answering request");
			pout.println("Hello world");
			outputS.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```


----------



## HoaX (31. Mrz 2011)

Also bei mir kommt dann:

```
Server running on 8080...
Request
Remote IP addr     = /0:0:0:0:0:0:0:1
Remote port        = 57246
Local IP addr      = /0:0:0:0:0:0:0:1
Local port         = 8080
Local socket addr  = /0:0:0:0:0:0:0:1:8080
Answering request
```
Und das passt ja. 
Ubuntu 10.10 64bit, Oracle 1.6.0_24


----------



## Andi_CH (31. Mrz 2011)

Ich habe auch nichts anderes erwartet, als dass bei dir dasselbe kommt, aber ich möchte verstehen warum das so ist?.

Der name localhost wird in deinem Fall durch einen Zugriff auf /etc/hosts durch 127.0.0.1 ersetzt. Bei windows geschieht das auch, wenn auch auf etwas undurchsichtigere Art.
Also warum bekomme ich nicht 127.0.0.1 zu sehen?


----------



## Antoras (31. Mrz 2011)

Also, ich bekomme sowohl bei einem Zugriff über die IP als auch über die Domain immer die korrekte IP 127.0.0.1 ausgegeben. Hab aber keine Ahnung was da bei euch falsch konfiguriert sein könnte.

Mit dem noparse-Tag können auch Links richtig dargestellt werden -> [noparse]http://localhost:8080/[/noparse]


----------



## despikyxd (31. Mrz 2011)

es kommt *0* weil LOCALHOST eben nun mal KEIN interface ist ...
siehe dazu MSDN : *frei übersetzt* : sämtliche aufrufe von LOCAL an LOCAL werden über PIPES gelöst ... es werden keine SOCKETS erzeugst ...
wie das unter unix ist ... kp ... weil dort gibt es ja über ifconfig das interface lo0

wenn du über 127.0.0.1 aufrufst verhält es sich änlich ... nur hier wird die pipe genamed ... also das andere ende der pipe weis das diese pipe nunmal "127.0.0.1" heißt ...

mehr infos : GOOGLE


----------



## HoaX (31. Mrz 2011)

Also mein Win XP spuckt in beiden Fällen die 127.0.0.1 aus. Evtl liegt es bei dir am IPv6?

@despikyxd: Würdest du noch den Link nennen, welchen du Zitierst, dann könnte man evtl. sogar was mit der Antwort anfangen. Aber wie es intern abläuft sollte egal sein, auf beiden Seiten muss eine IP/Port verwendet werden, und die sollte der gegenüber auch sehen.


----------



## HoaX (31. Mrz 2011)

Andi_CH hat gesagt.:


> Ich habe auch nichts anderes erwartet, als dass bei dir dasselbe kommt, aber ich möchte verstehen warum das so ist?.
> 
> Der name localhost wird in deinem Fall durch einen Zugriff auf /etc/hosts durch 127.0.0.1 ersetzt. Bei windows geschieht das auch, wenn auch auf etwas undurchsichtigere Art.
> Also warum bekomme ich nicht 127.0.0.1 zu sehen?



Tests eben zeigen, dass bei dir wohl localhost zu 0.0.0.0 aufgelöst wird. Prüf das doch mal.

Nachtrag: Oder auch nicht, unter Linux kann ich zu 0.0.0.0 verbinden, und bekommt 127.0.0.1 angezeigt. Bei Windows meckert Telnet wenn ich zur 0.0.0.0 verbinden will, also kanns das auch nicht sein.


----------



## musiKk (31. Mrz 2011)

Sieht nach der Default route aus, oder?


----------



## HoaX (1. Apr 2011)

musiKk hat gesagt.:


> Sieht nach der Default route aus, oder?



Wie meinst du das?


----------



## FArt (1. Apr 2011)

Serversockets können auf ein Netzwerkdevice gebunden werden, wovon ein Standardrechner oft mehrere hat: den Loopback (localhost in irgendeiner Form) und die Netzwerkkarten (z.B. WiFi und Ethernet, auch mehrere gleichzeitig). Auf welches der Socket per Default gebunden wird, muss man in der Doku nachlesen.
Man kann einen Socket aber auch fest an einen Port binden. Dann ist er auch nur über diese Netzwerkadresse zu erreichen. Ist ein Socket an 0.0.0.0 gebunden bedeutet dass, er ist an alle verfügbaren Devices gebunden, also über alle für den Rechner zur Verfügung stehenden Adressen erreichbar.
Vergleiche: ServerSocket (Java 2 Platform SE v1.4.2)

Was man also wie und wo sieht hängt sehr stark von der lokalen Konfiguration des Rechners ab und wie er im Moment des Test in eines odere mehrere Netze eingebunden ist. 

Und dann kommt noch IPV6 ins Spiel...
Was sagt also obiger Test aus? Nichts, so lange man nicht weiß wie (s)ein Netzwerk aufgebaut ist und funktioniert.


----------



## Andi_CH (7. Apr 2011)

Hatte dazwischen anderes zu tun ... Die magischen Wege von Windows verblüffen mich immer wieder:



HoaX hat gesagt.:


> Tests eben zeigen, dass bei dir wohl localhost zu 0.0.0.0 aufgelöst wird. Prüf das doch mal.




```
C:\>ping localhost

Ping wird ausgeführt für DesktopAV [::1] mit 32 Bytes Daten:
Antwort von ::1: Zeit<1ms
```


```
ping ::1
```
 funktioniert tatsächlich auch - :bahnhof:

ping auf den Rechnernamen

```
C:\>ping Desktop

Ping wird ausgeführt für Desktop [fe80::a13f:dcb4:5d71:ed9e%11] mit 32 Bytes Daten:
Antwort von fe80::a13f:dcb4:5d71:ed9e%11: Zeit<1ms
```



HoaX hat gesagt.:


> Nachtrag: Oder auch nicht, unter Linux kann ich zu 0.0.0.0 verbinden, und bekommt 127.0.0.1 angezeigt. Bei Windows meckert Telnet wenn ich zur 0.0.0.0 verbinden will, also kanns das auch nicht sein.



0.0.0.0 ist keine gültige IP nummer, da ist es wohl eher Zufall was passiert - ping versucht es zwar, aber liefert "Allgemeiner fehler" (-> Win 7)


----------



## musiKk (7. Apr 2011)

Andi_CH hat gesagt.:


> 0.0.0.0 ist keine gültige IP nummer, da ist es wohl eher Zufall was passiert - ping versucht es zwar, aber liefert "Allgemeiner fehler" (-> Win 7)



Das behauptet (glaube ich) auch keiner. Es ist eine Notation, die offenbar verschiedene Dinge bedeuten kann. Wenn man 0.0.0.0 adressiert, bedeutet es wohl je nach Umgebung mal "default route". Viele Daemons unter Linux erlauben bei der Angabe der IP, an der ein Server lauschen soll, ebenfalls 0.0.0.0, was "alle Interfaces" bedeutet.


----------



## FArt (8. Apr 2011)

musiKk hat gesagt.:


> Das behauptet (glaube ich) auch keiner. Es ist eine Notation, die offenbar verschiedene Dinge bedeuten kann. Wenn man 0.0.0.0 adressiert, bedeutet es wohl je nach Umgebung mal "default route". Viele Daemons unter Linux erlauben bei der Angabe der IP, an der ein Server lauschen soll, ebenfalls 0.0.0.0, was "alle Interfaces" bedeutet.



0.0.0.0 bedeutet eigentlich immer alle Schnittstellen. Die "default route" geht einfach die Schnittstellen der Reihe nach durch, bis eines die Anfrage befriedigen kann.


----------

