Über welchen Netzwerkadapter kommt mein receive?

Cottonwood

Aktives Mitglied
Mein Client kann nicht mit dem Server kommunizieren, weil der PC des Clients zwei Netzwerkadapter hat und er (der Client) die falsche IP übermittelt.
Code:
Ethernetadapter LAN-Verbindung:

        Verbindungsspezifisches DNS-Suffix: fritz.box
        IP-Adresse. . . . . . . . . . . . : 192.168.178.24
        Subnetzmaske. . . . . . . . . . . : 255.255.255.0
        Standardgateway . . . . . . . . . : 192.168.178.1

Ethernetadapter LAN-Verbindung 2:

        Verbindungsspezifisches DNS-Suffix:
        IP-Adresse (Autokonfig.). . . . . : 192.168.46.21
        Subnetzmaske. . . . . . . . . . . : 255.255.255.0
        Standardgateway . . . . . . . . . :
Hier der Code und der Printout, mit denen man sehen kann, dass er die 192.168.46.21 erwischt:

Java:
				try {
					localMachine=java.net.InetAddress.getLocalHost().toString();
				} catch (UnknownHostException e1) {
					localMachine=ip;
				}	

				if (clientFirstCallTime.equals("")) clientFirstCallTime=String.valueOf(new Long(System.currentTimeMillis()));
				buf=("GT"+localMachine+"/"+clientFirstCallTime+"/").getBytes();//20110408
				if (testsw) ErrorWindow.errorMsg("v1.5.004 TimeClient:94 "+S.t()+" buf="+(new String(buf)));
Code:
v1.5.004 TimeClient:94 18708 buf=GTponderosa/192.168.46.21/1302731347864/, Thread=MusicPlayerClient4TimeClient

Die Server-IP hat er über den Receive einer Broadcast empfangen.
Kann ich heraus bekommen, über welche IP der Receive lokal empfangen wurde?

//Edit: Eine Änderung an der Netzwerkkonfiguration ist keine Lösung, weil das Problem ja auf jedem weiteren PC ebenfalls auftreten könnte. Ich kann das Programm also so, wie es jetzt ist, nicht weitergeben.
 

Anhänge

  • lan.jpg
    lan.jpg
    17,6 KB · Aufrufe: 26
Zuletzt bearbeitet:

Java123???

Mitglied
Wie wär es mit:
Java:
InetAddress[] address = null;
try {
    address = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
} catch (UnknownHostException ex) {
    Logger.getLogger(TestNetwork.class.getName()).log(Level.SEVERE, null, ex);
}
for(InetAddress ia : address) {
    System.out.println(ia.toString());
Ich denke der Code ist selbsterklärend.

Mfg
 

Cottonwood

Aktives Mitglied
Wie wär es mit...

...Ich denke der Code ist selbsterklärend.
Herzlichen Dank. Werde ich gleich ausprobieren. Ich gebe schnellstmöglich Bescheid.

Warum wird hier überhaupt explizit eine IP mitgeschickt?
Grundsätzlich ist das unsinnig. Das ist mir schon klar. Aber dies ist mein allererstes Java Projekt. Und da habe ich am Anfang noch viel weniger gewusst und verstanden als jetzt. Das ist sozusagen ein Relikt aus dieser Zeit. Verwendet wird es eigentlich nicht. Denn die Gegenseite holt sich die Adresse mit packet.getAddress():

Code:
		try {
			socket.receive(packet); 
		} catch (IOException e) {except=e;
		} catch (Exception e) {except=e;
		} finally {
			if (except!=null) {
				if (testsw) ErrorWindow.errorMsg("v1.5.004 CatchServerIP:42 "+S.t()+" "+except.toString());
				except=null;
			}else{
				address=packet.getAddress(); 
			}
		}
		if (testsw) ErrorWindow.errorMsg("v1.5.004 CatchServerIP:48 "+S.t()+" catchIP end socket.receive");

		if (testsw) ErrorWindow.errorMsg("v1.5.004 CatchServerIP:50 "+S.t()+" address="+address);

Drinnen gelassen habe ich das eigentlich, als/obwohl ich feststellen musste, dass InetAddress.getLocalHost().toString() unter Knoppix 127.0.0.1 zurückliefert. Das klingt jetzt auch wieder unsinnig. Ich habe es aber einfach gemacht, um ein besseres Verständnis dafür zu bekommen, wann bzw. wo was als IP zurückgegeben wird.

Das hat mir auch hier geholfen, weil ich sonst nie im Client-Protokoll das Problem hätte erkennen können.
 
Zuletzt bearbeitet:

Cottonwood

Aktives Mitglied
Ich danke dir. Unter XP funzt es prima:

Java:
            InetAddress[] taddress = null;
            try {
                taddress = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
            } catch (UnknownHostException ex) {
                //Logger.getLogger(TestNetwork.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
            if (testsw) ErrorWindow.errorMsg("v1.5.005 TimeClient:90 "+S.t()+" Beginn Ausgabe der IP-Adressen");
            for(InetAddress ia2 : taddress) {
              if (testsw) ErrorWindow.errorMsg("v1.5.005 TimeClient:92 "+S.t()+" "+ia2.toString());
            }
            if (testsw) ErrorWindow.errorMsg("v1.5.005 TimeClient:94 "+S.t()+" Ende Ausgabe der IP-Adressen");

Code:
v1.5.005 TimeClient:90 3574 Beginn Ausgabe der IP-Adressen, Thread=MusicPlayerClient4TimeClient
v1.5.005 TimeClient:92 3574 ponderosa/192.168.46.21, Thread=MusicPlayerClient4TimeClient
v1.5.005 TimeClient:92 3574 ponderosa/192.168.178.24, Thread=MusicPlayerClient4TimeClient
v1.5.005 TimeClient:94 3574 Ende Ausgabe der IP-Adressen, Thread=MusicPlayerClient4TimeClient

Allerdings klappt das bei Knoppix/debian nicht:

Code:
v1.5.005 TimeClient:90 2273 Beginn Ausgabe der IP-Adressen, Thread=MusicPlayerClient4TimeClient
v1.5.005 TimeClient:92 2273 Microknoppix/127.0.0.1, Thread=MusicPlayerClient4TimeClient
v1.5.005 TimeClient:94 2273 Ende Ausgabe der IP-Adressen, Thread=MusicPlayerClient4TimeClient

Hier hätte eine Zeile mit "Microknoppix/192.168.178.44" auftauchen müssen. Irgend eine Idee dazu?
 
Zuletzt bearbeitet:

Cottonwood

Aktives Mitglied
Da kommt leider auch nicht viel:

Java:
            InetAddress[] taddress = null;
            try {
                taddress = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
            } catch (UnknownHostException ex) {
                //Logger.getLogger(TestNetwork.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
            if (testsw)
          try {
            ErrorWindow.errorMsg("v1.5.006 TimeClient:92 "+S.t()+" InetAddress.getLocalHost().getHostName()="+InetAddress.getLocalHost().getHostName());
          } catch (UnknownHostException e2) {
            ErrorWindow.errorMsg("v1.5.006 TimeClient:94 "+S.t()+" InetAddress.getLocalHost().getHostName() Error: "+e2.toString());
          }
            for(InetAddress ia2 : taddress) {
              if (testsw) ErrorWindow.errorMsg("v1.5.006 TimeClient:97 "+S.t()+" "+ia2.toString());
            }
            if (testsw) ErrorWindow.errorMsg("v1.5.006 TimeClient:99 "+S.t()+" Ende Ausgabe der IP-Adressen");

Code:
v1.5.006 TimeClient:92 2197 InetAddress.getLocalHost().getHostName()=Microknoppix, Thread=MusicPlayerClient4TimeClient
v1.5.006 TimeClient:97 2197 Microknoppix/127.0.0.1, Thread=MusicPlayerClient4TimeClient
v1.5.006 TimeClient:99 2198 Ende Ausgabe der IP-Adressen, Thread=MusicPlayerClient4TimeClient
 
T

tuxedo

Gast
Diverse Linux-Distributionen neigen dazu den Hostnamen nach 127.0.0.1 aufzulösen.

Wirf doch mal einen Blick in /etc/hosts und korrigier die Einträge ggf.

- Alex
 

Cottonwood

Aktives Mitglied
Ich nehme mal an, dass die so aussieht, weil Knoppix ja normalerweise für verschiedene Hosts identisch ist. Wie sollte ich sie deiner Meinung nach ändern? Einfach die 127.0.0.1 durch 192.168.178.44 ersetzen? Oder eine zusätzliche Zeile? Wenn ja, wie müsste die aussehen?

Code:
knoppix@Microknoppix:/usr/share/lwjgl$ cat /etc/hosts
127.0.0.1	Microknoppix	Knoppix	localhost.localdomain	localhost
192.168.178.10  name-49b6b5f514 name-49b6b5f514         name-49b6b5f514
192.168.178.11  brycecanyon     brycecanyon             brycecanyon

::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
 

Java123???

Mitglied
Also, ich muss leider sagen, dass ich nicht die große Ahnung von Linux habe und deshalb kann ich dir nichts garantieren, aber du könntest mal versuchen die IPs mit deinem Netz.-Interface zu suchen:
Java:
NetworkInterface networkI = NetworkInterface.getByName(InetAddress.getLocalHost().getHostName());
Enumeration<InetAddress> e = networkI.getInetAddresses();
while(e.hasMoreElements())
    System.out.println(e.toString());
 
Zuletzt bearbeitet:

Cottonwood

Aktives Mitglied
Da gibt es leider eine NullPointer Exception.

Java:
				NetworkInterface networkI = null;
				try {
				    networkI = NetworkInterface.getByName(InetAddress.getLocalHost().getHostName());
				} catch (SocketException ex) {
				    //Logger.getLogger(TestNetwork1.class.getName()).log(Level.SEVERE, null, ex);
					ex.printStackTrace();
				} catch (UnknownHostException e) {
					e.printStackTrace();
				}
				Enumeration<InetAddress> ea=null;
				try {
				ea = networkI.getInetAddresses();
				} catch (NullPointerException e) {
					ErrorWindow.errorMsg("v1.5.007 TimeClient:97 "+S.t()+" "+e.toString());
				}
				while(ea.hasMoreElements())
					ErrorWindow.errorMsg("v1.5.007 TimeClient:100 "+S.t()+" "+ea.toString());

Code:
v1.5.007 TimeClient:97 470190 java.lang.NullPointerException, Thread=MusicPlayerClient4TimeClient
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Ich nehme mal an, dass die so aussieht, weil Knoppix ja normalerweise für verschiedene Hosts identisch ist.

Aber bei einem frisch installierten Debian ist es AFAIK das selbe Problem.

Wie sollte ich sie deiner Meinung nach ändern? Einfach die 127.0.0.1 durch 192.168.178.44 ersetzen? Oder eine zusätzliche Zeile? Wenn ja, wie müsste die aussehen?

Code:
knoppix@Microknoppix:/usr/share/lwjgl$ cat /etc/hosts
127.0.0.1	Microknoppix	Knoppix	localhost.localdomain	localhost
192.168.178.10  name-49b6b5f514 name-49b6b5f514         name-49b6b5f514
192.168.178.11  brycecanyon     brycecanyon             brycecanyon

::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Wenn die IP hinter dem Hostnamen "Microknoppix" "192.168.178.44" ist, dann sollte die hosts-File wie folgt aussehen (IPv6 und andere HOsts hab ich mal weggelassen):

Code:
127.0.0.1	localhost.localdomain	localhost
192.168.178.44 Microknoppix	Knoppix

Dann werden "localhost.localdomain", sowie "localhost" zu 127.0.0.1 aufgelöst, und "Microknoppix", sowie "Knoppix" zu 192.168.178.44 ...

Gruß
Alex
 

Cottonwood

Aktives Mitglied
Das war die Idee. Wegen einer NullPointerException sieht der Code jetzt etwas anders aus. Aber egal. Das war's, denke ich.

Java:
				Enumeration<NetworkInterface> netInter=null;
				try {
					netInter = NetworkInterface.getNetworkInterfaces();
				} catch (SocketException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				int n = 0;

				while ( netInter.hasMoreElements() )
				{
					NetworkInterface ni = netInter.nextElement();
					ErrorWindow.errorMsg("v1.5.008 TimeClient:97 "+S.t()+" NetworkInterface " + n++ + ": " + ni.getDisplayName());

					for (InetAddress iaddress : Collections.list(ni.getInetAddresses()))
					{
						ErrorWindow.errorMsg("v1.5.008 TimeClient:101 "+S.t()+" CanonicalHostName: " +iaddress.getCanonicalHostName());
						ErrorWindow.errorMsg("v1.5.008 TimeClient:102 "+S.t()+" IP: " + iaddress.getHostAddress());
						ErrorWindow.errorMsg("v1.5.008 TimeClient:103 "+S.t()+" Loopback? " + iaddress.isLoopbackAddress());
						ErrorWindow.errorMsg("v1.5.008 TimeClient:104 "+S.t()+" SiteLocal? " + iaddress.isSiteLocalAddress());
						ErrorWindow.errorMsg("v1.5.008 TimeClient:105 "+S.t()+" ");
					}
				}

Ich habe die Printouts auf die Nettodaten reduziert.
Hier das Ergebnis von Knoppix:
Code:
 NetworkInterface 0: eth0
 CanonicalHostName: fe80:0:0:0:a00:27ff:fed0:5984%2
 IP: fe80:0:0:0:a00:27ff:fed0:5984%2
 Loopback? false
 SiteLocal? false
 
 CanonicalHostName: 192.168.178.50
 IP: 192.168.178.50
 Loopback? false
 SiteLocal? true
 
 NetworkInterface 1: lo
 CanonicalHostName: localhost
 IP: 0:0:0:0:0:0:0:1%1
 Loopback? true
 SiteLocal? false
 
 CanonicalHostName: Microknoppix
 IP: 127.0.0.1
 Loopback? true
 SiteLocal? false

Hier das Ergebnis von XP:
Code:
 NetworkInterface 0: MS TCP Loopback interface
 CanonicalHostName: localhost
 IP: 127.0.0.1
 Loopback? true
 SiteLocal? false
 
 NetworkInterface 1: Realtek RTL8139-Familie-PCI-Fast Ethernet-NIC - Paketplaner-Miniport
 CanonicalHostName: ponderosa.fritz.box
 IP: 192.168.178.24
 Loopback? false
 SiteLocal? true
 
 NetworkInterface 2: Virtual DVB-S/-C/-T Network Adapter - Paketplaner-Miniport
 CanonicalHostName: PONDEROSA
 IP: 192.168.46.21
 Loopback? false
 SiteLocal? true

Ich prüfe jetzt noch, ob Knoppix jetzt wirklich 192.168.178.50 geworden ist. War bisher immer 192.168.178.44

//Edit: 192.168.178.50 ist jetzt richtig. Warum auch immer.
Aber das heisst jetzt auch, dass ich die IP nicht einfach fest eintragen kann. Ich denke darüber nach und melde mich wieder.

//Edit: Ich werde aus den Daten alle IP's extrahieren, die mit 192.168. beginnen und diese in den Daten des send() an den Server übertragen. Wenn dann die Verbindung über packet.getAddress() nicht klappt, kann der Srever die anderen Adressen probieren. Dann sollte es klappen. Und wenn nicht, dann kann ich mir über den Testschalter alle erforderlichen Informationen geben lassen. ;)

Noch einmal einen ganz herzlichen Dank.:toll:
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Die richtige IP automatisch finden, wenn mehrere Devices da sind, ist nicht ohne.

Hab jetzt gelesen dass es durchaus Sinn macht den eigenen Hostnamen nach 127.0.0.1 auflösen zu lassen. Denn meist wird mit dem Hostnamen versucht eine Verbindung aufzubauen. Und zu sich selbst baut man am besten eine Verbindung zu 127.0.0.1 auf (weil schneller).

Den Hostnamen zu benutzen um die richtige IP rauszufinden ist demnach bei manchen (oder vielen) Linux-Distributionen nur dann möglich, wenn die Namensauflösung richtig eingestellt wurde.

Das impliziert aber, dass man selbst die korrekte IP weiß und diese dann entsprechend in der Hosts-Datei konfiguriert hat. Dann kann man aber auch gleich die eigene Anwendung richtig konfigurieren und da die korrekte IP angeben.

- Alex
 

Cottonwood

Aktives Mitglied
Dir auch noch einen ganz herzlichen Dank. :toll:

Ich glaube, dass das jetzt aber funktionieren könnte. Sofern immer die richtige IP dabei ist, falls der packet.getAddress() nicht die richtige IP liefert.

Ist so'n bischen von hinten durch die Brust ins Auge. Aber wann's schee macht :D
 

Ähnliche Java Themen

Neue Themen


Oben