Entwickler-Ecke

Internet / Netzwerk - Verbindung zum Internet


Pipecheck - Sa 22.06.02 23:06
Titel: Verbindung zum Internet
Kann mir bitte jemand auf EINFACHE weise erklären wie ich checke ob eine Internetverbindung besteht?
Es soll einfach nur ausgegeben werden ob im Netz, oder nicht...
ich hoffe, das ist ein nicht ganz so alter hut.
greets Pipecheck


Klabautermann - So 23.06.02 01:49

Hallo,

doch das ist ein alter Hut und die Antwort ist immer wieder enttäuschend.
Es geht nicht. Zumindest nicht, wenn man ausschließen will, das der Test nicht selber eine Verbindung aufbaut, wenn der Rechner so konfiguriert ist, dass er bei anforderung eine Verbindung aufbauht.
Ein weiteres Problem ist, das der Netzwerkzugriff unter der Windows 9x reihe anders realisiert ist als unter der NT Reihe.

Also wie gesagt. Die universelle Lösung git es meines wissens nicht und wenn doch dann wird sie sicherlich nicht einfach sein (allein wegen der unterscheidung der Windowse).
Aber ich lasse mich gerne verbessern ;).

Gruß
Klabautermann


Torsten - So 23.06.02 02:12

Moinsen!

Also ich verwende dazu die Funktion InternetGetConnectedState aus der Unit WinInet.

Kleines Beispiel:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
uses ... WinInet, ... ;

...

if InternetGetConnectedState(nil, 0) then
   ShowMessage('Ja, logen doch')
else
   ShowMessage('Nööö, doch nicht');
...


Hat bis dato auch immer funktioniert.

Jedoch konnte ich nicht testen, ob dabei eine Verbindung aufgebaut wird. Habe es immer nur hinter einem Router testen können.
Doch ich lasse mich auch gerne belehren. ;)

Grüße

Torsten


Pipecheck - So 23.06.02 14:02

hehe, Torsten ist mein Gott :D


Stefan - Do 27.06.02 17:59

Servus,

also dieses InternetGetConnectedState hat bei mir den Haken, dass es nur wenn ich über eine DFÜ-Verbindung online gehe funktioniert. Gehe ich z.B. mit einer älteren T-online Software oder durch ICS Software wie KEN ins Netz wird immer online angezeigt, auch wenn ich offline bin.

Ich habs auch schon mit der Abfrage der Regestry versucht, die ja auch erkennt, ob man online bzw offline ist. Hat aber auch nix gebracht.

Vielleicht weiss ja hier einer was...


Torsten - Do 27.06.02 18:54

Moinsen!

Wo fragst Du das denn in der Registry ab?
Wenn die Registry das kennt (so wie Du schreibst), dann sollte man es doch auch abfragen können.

Grüße

Torsten


Stefan - Do 27.06.02 20:30

Hier ist der Code. Hab ich mal irgendwo gelesen, und da das mit dem InternetGetConnectedState bei mir nicht eindeutig funzt einfach ausprobiert. Leider kenn ich mich mit der Regestry nicht so gut aus, dass ich sagen kann, ob sich an der Stelle wies im Code steht überhaupt der online/offline Eintrag befindet.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Function IsConnected : Boolean;
var reg: TRegistry;
      buff: dword;
begin
    reg := tregistry.Create ;
    Reg.RootKey := HKey_local_machine;
    if reg.OpenKey('\System\CurrentControlSet\Services\RemoteAccess',false) then begin
       reg.ReadBinaryData('Remote Connection',buff,sizeof(buff));
       result := buff = 1;
       reg.CloseKey ;
       reg.Free ;
    end;
end;


und so frag ichs ab:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm2.Button2Click(Sender: TObject);
begin

 If IsConnected = true then begin
    StaticText1.Font.Color := clgreen;
    StaticText1.Caption := ' online ';
  end
  else begin
    StaticText1.Font.Color := clred;
    StaticText1.Caption:=' offline ';
  end;
end;


Also, Torsten, was meinst du dazu?


Torsten - Do 27.06.02 20:47

Moinsen!

Hmm, das ist meiner Meinung nach nicht das Richtige.
Zum einen schreckt ja schon der Name RemoteAccess ab. Es geht dabei wohl eher darum, ob remote access zugelassen (eingeschaltet) wird.

In meiner Registry gibt es noch nicht mal diesen Wert. Ich wäre also offline beim Schreiben dieses Textes ;)

Tja, dennoch werde ich mich mal weiter erkundigen.
Nur schade, dass meine Funktion nicht arbeitet. Jedenfalls nicht immer. Gut zu wissen.

Grüße

Torsten


Torsten - Do 27.06.02 20:59

Moinsen!

Mir fällt da gerade noch ein anderer Weg ein.
Ist bestimmt nicht ganz sauber, sollte aber klappen.

Wenn also obiges Beispiel nicht klappt, dann besteht noch immer die Möglichkeit, einen Verbindungsaufbau zu einer bekannten IP im Netz zu versuchen.

Also beispielsweise über TClientSocket zu einer bekannten IP (da bietet sich eine Webseite über Port 80) an.
Das Problem ist nur, dass auch diese IP mal nicht erreichbar sein kann, obwohl man selber online ist. (auch Server stürzen mal ab ;) )

Grüße

Torsten


Stefan - Do 27.06.02 21:06

Also bei mir ist dieser Eintrag REMOTEACCESS gibts bei mir schon. Aber wie gesagt: Ich habe keine Ahnung von der Windows Regestry (hat micht immer irgendwie angeschreckt) und leider kein Buch etc. darüber zur Hand.

Haha :) ! Grade wollte ich posten, da bist du mir zuvor gekommen!

Das hab ich mir auch schon überlegt. Doch ich meine ich hätte mal gehört, dass sich manche Internet Server auf einen Ping nicht zurückmelden. Dennoch haben gerade 100% der Adressen, die ich versucht habe anzupingen reagiert. Man sollte halt populäre nehmen, wie http://www.gmx.de oder http://www.google.de. Die sind ja (fast) immer online.

Ich probiers gleich mal richtig aus. Bis denn.


Arakis - Do 27.06.02 22:03
Titel: 2 Möglichkeiten
Mir fallen da zwei Möglichkeiten ein: 1. Abchecken, ob man eine Internet-IP hat, wenn man einen leeren String zurück bekommt, dann ist man halt nicht online. Wie man die Internet-IP abfragt, habe ich gerade in das Internet-FAQ gepostet.
2. Möglichkeit wäre über diese Komonente:
http://dateien.desk-work.de/delphi/komponenten/tmswebconn.zip

Bis dann
user defined image


FriFra - Fr 28.06.02 00:15

Das ganze vorhaben ist Unmöglich! Wie soll man auch zwischen Intra und Internet unterscheiden ohne auf externe Resourcen zuzugreifen??? Dieser Zugriff führt allerdings bei den meisten Verbindungsarten zu einer Einwahl, was das ganze sinnlos macht.

Die Einzige Lösung wäre, man würde einen Port reservieren welcher bei allen Verbindungsarten nicht zum Verbindungsaufbau führt. Dann bräuchte man nur noch über diesen Port einen Connect auf einen externen Server zu versuchen. Aber leider wird das nicht gehen, da sich dann alle an diesen Standart halten müssten....


Arakis - Fr 28.06.02 00:18
Titel: Sag niemals Nie!
Sag niemals Nie!
Ich probiere dass morgen mal bei mir in der Firma aus.

Bis dann
user defined image


Torsten - Fr 28.06.02 09:22

Moinsen!

OK, das wäre die eine Möglichkeit.
Doch ich habe da noch was im Kopf. Meines Erachtens nach können die Winshoes Komponenten auch Abhilfe schaffen. Die konnten, so jedenfalls meine Erinnerung, genau feststellen, ob online oder offline. Ein Blick in den Code wäre mal eine Möglichkeit.
Zu finden bei Torry.

Grüße

Torsten


FriFra - Fr 28.06.02 10:11

Das können diese Kompos auch nicht, glaub mir! Ich habe selbst ein Lan mit Verbindung nach aussen. Woher wollen denn die Compos wissen, wann der Router online ist? Ohne connect nach aussen geht es nicht, und der bewirkt nun mal meistens einen Verbindungsaufbau...


Sephiroth - Fr 28.06.02 11:56

Hmm mal zu dem Lösungsansatz mit dem TClientsocket und TServerSocket. Ich würde das Problem dann folgendermaßen lösen.
Ich versuche über das Internet auf meinen eigenen Server (also 127.0.0.1) zu connecten. Wenn man nämlich bei der Clientsocket nur den "Host" angibt versucht er soweit ich weiss alles übers Internet zu senden. Erst wenn man bei "Address" eine IP eingibt sendet ers Lokal.
Somit könnte man doch feststellen ob man online ist eigentlich...

Werd ich mal am Wochenende ausprobieren...

Was haltet ihr davon?


FriFra - Fr 28.06.02 12:35

Nicht ganz richtig...
Wenn ein Hostname angegeben wird, wird eine DNS Auflösung gemacht, diese führt i.d.R. zum Verbindungsaufbau. Gibt man eine IP an gibt es auf jeden Fall keine DNS Auflösung.
Nun müsste man aber versuchen zu einem externen Host zu connecten um wirklich sicher zu sein, das man offline ist. Und bei genau diesem Versuch scheitert der Ansatz, da dies meist zum Verbindungsaufbau führt!

Zitat:
Ich versuche über das Internet auf meinen eigenen Server (also 127.0.0.1) zu connecten.

Das funktioniert nicht, da 127.0 bzw 192.168 private IP's sind, welche Du übers Internet nie erreichen wirst! Das geht nur mit der IP die Du vom ISP bekommst.


Torsten - Fr 28.06.02 13:42

Hmm, wenn also ein Verbindungsaufbau gemacht wird, dann ist das freilich auch keine Lösung. Schade eigentlich. War nur eine Idee.

Und die Winshoes können das also auch nicht. Wie dumm.

Aber wir finden bestimmt eine Lösung, gemeinsam. ;)

Grüße

Torsten


FriFra - Fr 28.06.02 17:25

Das kann nur funktionieren, wenn man für seine Verbindung (Router. Modem etc.) jeweils eine Rolle definieren könnte, wo über einen bestimmten Port nur bei bestehender Verbindung Pakete durchgelassen werden. Nur der Router "weis" ob er online ist...

Nochwas zu Routern. Ich habe ein Tool [http://www.frifra.de/Informatik/index.php4?MainItem=2&SubItem=2#0] geschrieben, welches mit sehr vielen gängigen Routern zusammenarbeitet und deren Status ausliest ohne einen Verbindungsaufbau auszulösen. Die Verbindungsdaten werden dann auch in die Registry geschrieben.


ArnF - Fr 13.09.02 21:51

Ich hab mal eine Komponente gefunden, mit der der Status einfach überprüft wurde. Mit einem Timer wird ständig die eigene IP-Adresse abgefragt. Hat man eine Adresse, so ist man online.
Hab es nicht ausprobiert und hab von Netzwerken nicht allzuviel Ahnung, aber könnte doch funktionieren.


DeCodeGuru - Fr 13.09.02 21:54

hi arnf,

wie hieß die Komponente denn? War es vielleicht TDialUp?


ArnF - Fr 13.09.02 21:58

Nein, sie heißt TOnlineIP.

Ich kann sie dir ja mal schicken, wenn du es testen willst.


Torsten - Fr 13.09.02 22:01

Moinsen!

Tja, die Idee ist gut. Doch wird es nicht immer funktionieren.

Denn sitzt man hinter einem Router, so hat man immer eine IP aus dem Class-C-Netz. Man muss jedoch nicht online sein.
Somit wirft diese Abfrage einen Fehler auf.

MS hat aber einen Schwung neuer (bis dato undokumentierter) API-Funktionen veröffentlicht. Ich werde da mal schauen.

Grüße

Torsten


DeCodeGuru - Fr 13.09.02 22:06

Zitat:
MS hat aber einen Schwung neuer (bis dato undokumentierter) API-Funktionen veröffentlicht. Ich werde da mal schauen.


Ey, das wäre super. Ich suche schon für dieses Prob lange eine Lösung. :cry: :wink:


FriFra - So 15.09.02 15:52

Kann nicht funktionieren, da bei einer Routeranbindung durch den Request auf einen externen Server eine Verbindung aufgebaut wird. Diesen sinnlosen Verbindungsaufbau kann man nur verhindern indem man den Router abfragt.


Torsten - So 15.09.02 16:00

... siehe zwei postings zuvor

Grüße

Torsten


fbkreon - So 27.10.02 13:03

http://www.swissdelphicenter.ch/de/showcode.php?id=70

Vielleicht hilft euch das weiter....