# Über welchen Netzwerkadapter kommt mein receive?



## Cottonwood (14. Apr 2011)

Mein Client kann nicht mit dem Server kommunizieren, weil der PC des Clients zwei Netzwerkadapter hat und er (der Client) die falsche IP übermittelt. 

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


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


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


----------



## Java123??? (14. Apr 2011)

Wie wär es mit:

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


----------



## FArt (14. Apr 2011)

Warum wird hier überhaupt explizit eine IP mitgeschickt?


----------



## Cottonwood (14. Apr 2011)

Java123??? hat gesagt.:


> Wie wär es mit...
> 
> ...Ich denke der Code ist selbsterklärend.


Herzlichen Dank. Werde ich gleich ausprobieren. Ich gebe schnellstmöglich Bescheid.



FArt hat gesagt.:


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


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


----------



## FArt (14. Apr 2011)

Dann musst du an einer multicast Maschine aber auch die richtige IP ermitteln, und nicht die erstbeste nehmen...


----------



## Cottonwood (14. Apr 2011)

Ich danke dir. Unter XP funzt es prima:


```
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");
```


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


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


----------



## Java123??? (14. Apr 2011)

Mhm, dann wär es mal interessant zu wissen, was 
	
	
	
	





```
InetAddress.getLocalHost().getHostName()
```
zurückgibt.


----------



## Cottonwood (14. Apr 2011)

Da kommt leider auch nicht viel:


```
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");
```


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


----------



## tuxedo (14. Apr 2011)

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 (14. Apr 2011)

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?


```
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??? (14. Apr 2011)

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:

```
NetworkInterface networkI = NetworkInterface.getByName(InetAddress.getLocalHost().getHostName());
Enumeration<InetAddress> e = networkI.getInetAddresses();
while(e.hasMoreElements())
    System.out.println(e.toString());
```


----------



## Cottonwood (14. Apr 2011)

Da gibt es leider eine NullPointer Exception.


```
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());
```


```
v1.5.007 TimeClient:97 470190 java.lang.NullPointerException, Thread=MusicPlayerClient4TimeClient
```


----------



## tuxedo (14. Apr 2011)

Cottonwood hat gesagt.:


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



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


```
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 (14. Apr 2011)

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


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

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

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


----------



## tuxedo (14. Apr 2011)

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 (14. Apr 2011)

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


----------

