Socket liefert leere IP-Nummern

Andi_CH

Top Contributor
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:
Code:
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:
Code:
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:
Java:
	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);
 
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 ;-)

Java:
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();
		}
	}
}
 
Zuletzt bearbeitet:
Also bei mir kommt dann:
Code:
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
 
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?
 
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]
 
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
 
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.
 
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.
 
Zuletzt bearbeitet:
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.
 
Hatte dazwischen anderes zu tun ... Die magischen Wege von Windows verblüffen mich immer wieder:

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

Code:
C:\>ping localhost

Ping wird ausgeführt für DesktopAV [::1] mit 32 Bytes Daten:
Antwort von ::1: Zeit<1ms
Code:
ping ::1
funktioniert tatsächlich auch - :bahnhof:

ping auf den Rechnernamen
Code:
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

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

Neue Themen


Zurück
Oben