# aktive Internetverbindung ermitteln



## andy_y (12. Sep 2007)

Hallo,
ist es allein in Java machbar, zu ermitteln, ob eine Verbindung zum Internet besteht oder nicht??
Die einzige Möglichkeit, die mir jetzt einfallen würde, wäre zu versuchen, die Verbindung zu einer beliebigen Seite herzustellen. Aber ich möchte das eigentlich nicht so machen. Zum einen weil es nicht immer heissen muss, dass keine Internetverbindung besteht, nur weil der Server der Seite nicht erreichbar war. Zum anderen interessiert's mich auch mal.

Wär schön wenn mir jemand helfen kann...
Danke im Voraus...


----------



## Ullenboom (12. Sep 2007)

Hi,

wenn der Rechner über einen Einwahlrouter geht, ist es schwieriger. Wenn der Rechner selbst die (Einwahl-)Verbindung herstellt, kannst du einfach schauen, ob der Rechner "eine zweite IP-Adresse" hat. Rufe einmal ipconfig mit und ohne Verbindung, dann kannst du einen Unterschied sehen. Jetzt musst du nur noch aus einem Java-Programm ipconfig aufrufen und das Ergebnis parsen.

 Christian


----------



## tuxedo (12. Sep 2007)

Naja, zum einen kannst du checken ob verlässliche webseiten ereichbar sind (google.de, sun.com, ...), zum anderen kannst du schauen ob du Hostnamen in IP-Adressen auflösen kannst. 

Wenn du aber google.de erreichst, hat auch die Auflösung des Hostnamens geklappt. 

Da von Netzwerk zu Netzwerk die Internetverbindung anders aussieht und auch anders aufgebaut wird, gibt es wohl keine Einheitliche Methode (außer prüfen ob du seiten im Internet erreichen kannst) um festzustellen ob du gerade online bist.

- Alex


----------



## HoaX (12. Sep 2007)

Ullenboom hat gesagt.:
			
		

> Hi,
> 
> wenn der Rechner über einen Einwahlrouter geht, ist es schwieriger. Wenn der Rechner selbst die (Einwahl-)Verbindung herstellt, kannst du einfach schauen, ob der Rechner "eine zweite IP-Adresse" hat. Rufe einmal ipconfig mit und ohne Verbindung, dann kannst du einen Unterschied sehen. Jetzt musst du nur noch aus einem Java-Programm ipconfig aufrufen und das Ergebnis parsen.
> 
> Christian



was wenn der rechner noch in einem zweiten netz ist (lan und wlan)? wenn der rechner über firewire verfügt? was wenn es auf dem rechner kein ipconfig gibt (linux,...)?



			
				andy_y hat gesagt.:
			
		

> Die einzige Möglichkeit, die mir jetzt einfallen würde, wäre zu versuchen, die Verbindung zu einer beliebigen Seite herzustellen. Aber ich möchte das eigentlich nicht so machen. Zum einen weil es nicht immer heissen muss, dass keine Internetverbindung besteht, nur weil der Server der Seite nicht erreichbar war. Zum anderen interessiert's mich auch mal.



was wenn beim zugriff auf eine seite automatisch eine verbindung erstellt wird?


eine wirklich sichere lösung zum bestimmen gibt es nicht.


----------



## andy_y (13. Sep 2007)

Hallo,
vielen Dank für die schnellen Antworten.

Das Programm soll im Prinzip nichts weiter machen, als immer wieder zu prüfen, ob eine Verbindung zum Internet besteht, oder nicht. Unterm Strich soll es ermitteln, wie lange der Rechner zum Internet verbunden war (also, sobald eine Verbindung besteht: Zeit merken; und wenn keine Verbindung mehr besteht, ebenfalls Zeit merken und dann ausrechnen, wieviel Minuten es waren (klingt vielleicht lächerlich und wahrscheinlich gibt es da auch fertige Programme für, aber es geht mir um das Problem an sich)). Das mit dem ausrechnen ist auch alles kein Problem, nur die Sache mit dem prüfen, ob eine Verbindung besteht oder nicht ... 
Da ich nur über eine Modem-Verbindung verfüge, wollte ich eigentlich darauf verzichten ständig eine Verbindung zu irgendeiner Seite aufzubauen. Ausserdem müsste einmal pro Sekunde getestet werden, ob eine Verbindung besteht, oder nicht. Ich denk mal, dass sich das nicht sonderlich positiv bemerkbar macht ...
Die Möglichkeit, dass der Rechner über ein Netzwerk ins Internet geht muss erstmal nicht beachtet werden.
Auch kann davon ausgegangen werden, dass es sich ausschließlich um Windows handelt auf dem das Programm laufen soll.

Ich dachte man kann vielleicht direkt vom System abfragen, ob eine Verbindung besteht, damit würde ich auch die Verbindung an sich nicht ständig belasten ...

MfG


----------



## tuxedo (13. Sep 2007)

Das problem ist dass man generell nicht einfach Windows oder Linux fragen kann: Bist du mit dem Internet verbunden?

Das geht nicht. Und das hat auch nix mit Java zu tun. Mit C und jeder anderen Sprache stehst du vor dem gleichen Problem.
Du kannst nur schauen ob du eine Verbindung in das zu prüfende Netzwerk aufbauen kannst. Erst dann weißt du ob du verbunden bist.

So, du kannst das natürlich auch "spezialisieren"... Beispiel analoges Modem. Das Modem weiß ob es den "Hörer" abgenommen hat. Aber ein eine Netzwerkkarte kann man nicht einfach fragen ob sie mit dem Internet verbunden ist. Du kannst vielleicht abfragen ob das Netzwerkkabel drin steckt, aber das war's dann schon. 

Du kommst also nicht drum rum einen Server im Internet zu kontaktieren und schauen ob's klappt.


----------



## andy_y (13. Sep 2007)

Hm... schade. Na gut, dann muss ich mir was einfallen lassen ...
Ich hab's grade mal mit 

```
URL url = new URL( "http://www.google.de" );
InputStream in = url.openStream();
```
 probiert. Das sind pro Anfrage ca. 2KB und das ist bei einer Modem-Verbindung nicht gerade wenig...


----------



## tuxedo (13. Sep 2007)

Du musst keinen Stream öffnen.

Es reicht aus nen Client-Socket zu öffnen. Ich hab da was, glaub ich, momentchen...

- Alex


----------



## tuxedo (13. Sep 2007)

schau mal hier: http://www.java-forum.org/de/viewtopic.php?t=47888&highlight=reachable

Ganz am Ende des POsts hab ich ne Mini-Klasse mit der du das ganz easy checken kannst. Schadet aber nix wenn du den Thread auch bis zum Ende liest.

- Alex


----------



## HoaX (13. Sep 2007)

alex0801 hat gesagt.:
			
		

> Das problem ist dass man generell nicht einfach Windows oder Linux fragen kann: Bist du mit dem Internet verbunden?
> 
> Das geht nicht. Und das hat auch nix mit Java zu tun. Mit C und jeder anderen Sprache stehst du vor dem gleichen Problem.
> Du kannst nur schauen ob du eine Verbindung in das zu prüfende Netzwerk aufbauen kannst. Erst dann weißt du ob du verbunden bist.



naja, zumindest unter windows sollte es doch mittels TAPI möglich sein das heraus zu finden - bzw ob eine einwahlverbindung besteht.


wenn andy_y sowieso nur für seinen rechner entwickelt kann er auch die anzahl der ips checken. um zumindest hier von ipconfig unabhängig zu sein kann man sicherlich auch mittels InetAddress irgendwie die ips auflisten.


----------



## tuxedo (14. Sep 2007)

Ähm, Einwahl ist jetzt so ne Definitionssache. "Einwählen" kann sich sogesehen auch ein Router (PPPOE etc.). Und es ist nicht gesagt dass der UPnP kann und Windows dadurch ermitteln kann ob der Router online ist oder nicht. Ich wüsste ansonsten nicht wie ein TAPI in einem allgemeinen Netz rausfinden soll/kann ob eine Verbindung zum Internet besteht, vor allem wenn nicht der Computer für den Verbindungsaufbau zuständig ist, sonder Gerät XYZ _irgendwo_ im Netzwerk, vermutlich hinter 3 Routern und 4 Gateways "verborgen".

Wenn du eine stinknormale Modemverbindung meinst: Ja, so zwischen den Zeilen konnte man lesen dass es vermutlich um ein Modem geht bei dem der Traffik nicht ganz egal ist. Modems lassen sich ja soweit prüfen ob sie eine offene Verbindung haben oder nicht.

Und klar: Wenn es sich nur um eine lokale Geschichte dreht, dann lässt sich was "spezielles" anfertigen. Nochmal zu der Modemgeschichte:

Er will ja loggen wielange eine Verbindung zum Internet bestand. Wenn man das jetzt davon abhängig macht ob das Modem dem Höhrer abgenommen hat oder nicht, ist das doch eher unzuverlässig. Es kann ja auch vorkommen, dass das Modem die Verbindung aufgebaut hat, aber eine Nutzung der Verbindung nicht möglich ist, weil der zugewiesene Gateway nicht reagiert (was auch den Test auf eine zusätzliche, zugewiesene IP-Adresse hinfällig macht). Das gleiche trifft für alle möglichen Verbindungsarten zu.
Das wiederum würde heissen, der einzigste Weg herauszufinden ob eine funktionierende Internetverbindung besteht ist, zu prüfen ob man auch das Internet nutzen kann. Und das wiederum heisst, dass eine Funktion wie "isInternetConnectionWorking()" intern prüfen muss ob bestimmte Adressen erreichbar sind. 

Ich bin mit ziemlich sicher dass dieser Weg der "einfachste" ist und auch generell mit (fast) jedem Netzwerk funktioniert. Die in dem Link erwähnte Klasse hab ich hier übrigens zuverlässig im Einsatz.

- Alex


----------



## HoaX (15. Sep 2007)

einfach einem entfernten host zu kontaktieren ist auch nicht das gelbe vom ein, z.B. wenn automotische einwahl aktiviert hat ...



			
				HoaX hat gesagt.:
			
		

> eine wirklich sichere lösung zum bestimmen gibt es nicht.



und das egal in welcher programmiersprache


----------



## andy_y (15. Sep 2007)

Hmpf... naja, da muss ich mich wohl oder übel für eins entscheiden...
Ich danke euch auf jeden Fall für eure Antworten.

MfG


----------



## tuxedo (17. Sep 2007)

@Hoak

Ja, das mit dem Auto-Dial hab ich jetzt nicht berücksichtigt. Das wäre wohl ein "Sonderfall" ;-)


----------

