# Bestimmen der aktiven Netzwerkverbindung



## SilencerandLois (16. Mai 2012)

Hallo zusammen,
beim initialisieren einer Client-Server-Verbindung über JacORB muss JacORB natürtlich wissen, über welche IP-Adresse die Kommunikation läuft.
Sollte der Rechner nur eine einzige Netzwerkkarte bestitzen, so stellt das kein Problem dar. Sollten jedoch mehrere Netzwerkkarten vorhanden sein,  so wird bei JacORB direkt angegeben, über welche IP-Adresse die Kommunikation laufen muss.

Und hier ist nun das Problem.
In der aktuellen Variante iteriere ich über alle vorhandenen Adressen des Client-Rechners 
	
	
	
	





```
inetAddresses
```
. Bei jeder Adresse wird nun überprüft, ob der Client vom Server aus erreichbar ist (per isReachable). Sollte der Client über die IP-Adresse erreichbar sein, so habe ich meine Adresse gefunden.
Hier der Code dazu:

```
for (int i = 0; i < inetAddresses.length; i++) {

        NetworkInterface net = NetworkInterface.getByInetAddress(inetAddresses[i]);

        if (serverAdress.isReachable(net, 0, 500)) {
          myAdresse = inetAddresses[i];
          break;
        }
      }
```

Soweit so gut. Das ganze hat auch Jahrelang gut funktioniert. Nun wird jedoch beim Server (Windows Server Edition 2008) die Firewall eingeschaltet. Die Methode isReachable gibt nun immer false zurück, obwohl der Client per Ping erreichbar ist.
Ich habe auch bereits versucht, den TCP-Port 7 bei der Server-Firewall zu öffnen, da über diesen Port die Kommunikation der Methode isReachable läuft. Leider jedoch vergebens. Auch habe ich für IMCP alle Ports in der Firewall geöffnet.

Ich habe das Forum bereits über den isReachable()-Befehl durchsucht. Richtig weiter helfen konnte mir es jedoch leider nicht.

Wie kann ich also nun das eigentliche Problem lösen? Wie kann ich herausbekommen, welche IP-Verbindung bei mehreren Netzwerkkarten die korrekte ist, bzw. wie kann ich mein aktuelles Vorgehen anpassen, damit es funktioniert?


Besten Dank für eure Rückmeldungen und viele Grüße,
Martin


----------



## NIC (16. Mai 2012)

Ich kenne zwar das verwendete Framework nicht, verstehe aber trotzdem nicht ganz das Problem.
Grundsätzlich baut der Client eine Verbindung zum Server auf. Und dabei kann es dir erstmal egal sein von welchem Source-NIC das abläuft, denn dafür ist das OS zuständig. Das selbst zu implementieren ist sinnlos da am Ende das OS eh das letzte Wort hat über welches Source-NIC eine Verbindung zu einem bestimmten Ziel aufgebaut wird.

Wie nun der Server entscheidet ob und wenn ja auf welches NIC er sich bindet ist eine andere sache. Man nutzt hier aber in der Regel Wildcards so das der ServerSocket auf alle im System registrierten NICs reagiert. Eine zuteilung ServerSocket<->NIC ist z.B. beim vServer-Hosting wichtig, aber ich denke darum geht es hier nicht.

Warum du allerdings vom Server den Client anpingen willst verstehe ich nicht, da sorum keine normale Verbindung abläuft.


----------



## SilencerandLois (16. Mai 2012)

Hallo NIC,
entschuldige die Verwirrung.

Ich meinte: vom Client aus wird versucht, per isReachable den Server "an zu pingen". Sollte das bei einer der möglichen IP-Adressen des Clients möglich sein, wo wird diese verwendet.


Eigentlich hast du mit deiner Aussage natürlich recht, dass das Bestimmen der IP-Adresse Sache des OS sein sollte. Leider muss jedoch das Framework JacORB beim vorhanden sein mehrere IP-Adressen konfiguriert werden, welche benutzt werden soll. Ansonsten klappts nicht.


----------



## NIC (17. Mai 2012)

isReachable() ist eine sehr unzuverlässige Methode. Auszug aus der Doc:


			
				Java-Doc hat gesagt.:
			
		

> Test whether that address is reachable. Best effort is made by the implementation to try to reach the host, but firewalls and server configuration may block requests resulting in a unreachable status while some specific ports may be accessible. A typical implementation will use ICMP ECHO REQUESTs if the privilege can be obtained, otherwise it will try to establish a TCP connection on port 7 (Echo) of the destination host.


Das Problem dürften nicht die fehlenden Rechte sein um ein ICMP ECHO zu schicken, sondern viel mehr das viele Hosts darauf konfiguriert sind dies einfach zu schlucken (oder zumindest viele FireWalls).
Das mit TCP/7 kann man heutzutage eigentlich vergessen. Das stammt noch aus den Ur-Zeiten der Anfänge des Internets und wird heute nicht mehr verwendet. Zumindest meiner Erfahrung nach wirst du wohl kaum einen Server finden der einen TCP/7-ECHO Dienst betreibt.

Sehr viel sinnvoller ist es hier seine Client/Server-Architektur so aufzubauen das man beim Server einen festen Port hat der "offen" ist wenn die Server-Anwendung läuft. Dann kann man sich einfach über [c]new Socket("xxx.xxx.xxx.xxx", xxxxx)[/c] mit diesem verbinden. Gelingt diese Verbindung läuft der Server und mann kann über Socket.getLocalAddress() bzw Socket.getLocalSocketAddress() an die Informationen kommen von welcher lokalen IP aus der Socket läuft. Mit dieser geht man nun durch das NetworkInterface-Array und prüft welches NIC mit dieser IP läuft. Und dann kannst du halt das NIC (oder wenn auch nur die IP reicht dann direkt) an das Framework übergeben.


----------



## SilencerandLois (18. Mai 2012)

Danke für den Tipp mit dem Socket! Das funktioniert so!

Viele Grüße,
Martin


----------

