Entwickler-Ecke

Internet / Netzwerk - Internetverbindung checken


F.Art - Sa 04.01.03 19:04
Titel: Internetverbindung checken
Ich möchte ein Programm schreiben das checkt ob eine Internetverbindung besteht und wenn nicht das eine message kommt wo man mit ja oder nein antworten kann.Bei ja soll dann eine hergestellt werden.


Leathl - Sa 04.01.03 22:31

---


torstenheinze - Sa 04.01.03 22:44


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

procedure TForm1.Button1Click(Sender: TObject);
begin
  If InternetGetConnectedState(nil, 0) then
    Caption := 'Online'
  else
   Caption:='Offline';
end;

mit der massage, das kannst du ja selber


F.Art - So 05.01.03 14:49

Soweit ist es wie ich es gerne hätte beide Varianten kann ich verwerten. Aber wie kann ich eine Message machen wo ich auswählen kann yes or no?Und wie kann ich das machen das wenn keine Verbindung steht er auf aufforderung eine herstellt?

if IdIPWatch.IsOnline then goto Start else begin showmessage('Es besteht keine Internet Verbindung'); goto Ende; end;

Das klappt nicht ganz wenn er on ist ist alles ok aber bei off nicht.


Ex0rzist - So 05.01.03 18:03

Hallo,

versuche es mal so:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Uses WinInet;
...
Procedure VerbdgHerstellen;
begin
If not IdIPWatch1.IsOnline then
  begin
   If MessageDlg('Sie sind offline. Jetzt verbinden?', 
    mtConfirmation, [mbYes, mbNo], 0) = mrYes then  //Hier ist die Abfrage
      begin 
        if not InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE or 
        INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) then  //es wird versucht, die Standard-DFÜ-Verbindung                                                       //herzustellen
        begin 
         Showmessage('Es konnte keine Verbindung hergestellt werden.'); //Fehlernachricht
        end;
      end;
  end;
end;


Der Code ist ungetestet, müsste aber funktionieren.
Schlecht sieht es allerdings aus, wenn du DSL hast. Denn sobald ein Kabel in die Netzwerkkarte gesteckt ist, denkt Windows, dass du Online bist.


F.Art - So 05.01.03 18:31

Ich muss dich etwas korigieren.
Ich habe DSL und wenn ich Off bin meldet er mir das und wenn ich auf Ja drücke wählt er sich auch ein. Leider zeigt er mir immer off an auch wenn ich on bin.Jetzt muss das halt nurnoch stimmen dann ist es wie ich es möchte.

Aber THX für die Hilfe


Ex0rzist - So 05.01.03 19:04

Was hast du für ein Betriebssystem?
Wann wird bei dir geprüft, ob du online bist?

Ich habe mal ein Programm geschrieben, dass sich automatisch wieder einwählt, wenn die Verbindung unterbrochen wurde.
Ich nutze auch DSL und bei mir zeigt er den Online/Offline-Status korrekt an.

Vielleicht hilft es, wenn du ein bisschen Code postest.


F.Art - So 05.01.03 19:08


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

If not IdIPWatch.IsOnline then
  begin
  If MessageDlg(' Sie sind offline.'#13'Jetzt verbinden?',
     mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
     if not InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE or
        INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) then begin
         Showmessage('Es konnte keine Verbindung hergestellt werden.');
  end;
end;
end;

bei Modem und DSL gibt es bei mir keinen unterschied. Ich habe WinXP es soll aber für alle Windows versionen gehen.

(05.01. 19:20 Tino) Code-Tags hinzugefügt.


Ex0rzist - So 05.01.03 19:16

Den Code kenne ich ja schon. :wink:

Ich habe einen Timer benutzt, der alle paar Sekunden prüft, ob man online ist.
Wie machst du das?

Ich befürchte nämlich, dass du nachdem du wieder online bist, nicht den Online/Offline Status neu ermittelst.


F.Art - So 05.01.03 20:51

Ich habe ein Email Programm geschrieben und wenn man auf Senden klickt soll er checken ob eine INet verbindung besteht oder nicht.Wenn nicht dann soll er die herstellen wenn man yes drückt.


F.Art - Do 09.01.03 00:13
Titel: gelöst
Das habe ich so gelöst wie folgt aber ich bin nicht ganz zufrieden ist einfach zuviel Text. Müsste was gekürzt werden.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  WinInet, Registry, WinSock;
type
  TForm1 = class(TForm)
    Senden: TFlatSpeedButton;
  private
  public
  end;
const
  cERROR_BUFFER_TOO_SMALL = 603;
  cRAS_MaxEntryName = 256;
  cRAS_MaxDeviceName = 128;
  cRAS_MaxDeviceType = 16;

type
  TConnectionType = (ctNone, ctProxy, ctDialup);
  ERasError = class(Exception);
    HRASConn = DWord;
    PRASConn = ^TRASConn;
    TRASConn = record
      dwSize: DWORD;
      rasConn: HRASConn;
      szEntryName: array[0..cRAS_MaxEntryName] of Char;
      szDeviceType: array[0..cRAS_MaxDeviceType] of Char;
      szDeviceName: array [0..cRAS_MaxDeviceName] of char;
    end;
    TRasEnumConnections = function (RASConn: PrasConn; var BufSize: DWord;
     var Connections: DWord): LongInt; stdcall;


var
  Form1: TForm1;
  zuverf,accounttext  :string;
function ConnectedToInternet: TConnectionType;
function RasConnectionCount: Integer;
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}

function ConnectedToInternet: TConnectionType;
var Reg: TRegistry;
  bUseProxy: Boolean;
  UseProxy: LongWord;
begin
  Result := ctNone;
  Reg := TRegistry.Create;
  with REG do
    try
      try
        RootKey := HKEY_CURRENT_USER;
        if OpenKey('Software\Microsoft\WindowsCurrentVersion\Internet settings',
        false) then begin
          if GetDataType('ProxyEnable') = rdBinary then
            ReadBinaryData('ProxyEnable', UseProxy, SizeOf(LongWord))
          else begin
            bUseProxy := ReadBool('ProxyEnable');
            if bUseProxy then UseProxy := 1
            else UseProxy := 0;
          end;
          if (UseProxy<>0) and (ReadString('ProxyServer')<>'' ) then Result := ctProxy;
        end;
      except
      end;
    finally
      Free;
    end;
    if Result = ctNone then begin
      if RasConnectionCount > 0 then Result := ctDialup;
    end;
end;

function RasConnectionCount: Integer;
var RasDLL: HInst;
  Conns: array[1..4] of TRasConn;
  RasEnums: TRasEnumConnections;
  BufSize: DWord;
  NumConns: DWord;
  RasResult: Longint;
begin
  Result := 0;
  RasDLL := LoadLibrary('rasapi32.dll');
  if RasDLL = 0 then exit;
  try
    RasEnums := GetProcAddress(RasDLL,'RasEnumConnectionsA');
    if @RasEnums = nil then
      raise ERasError.Create('RasEnumConnectionsA not found in rasapi32.dll');
    Conns[1].dwSize := Sizeof (Conns[1]);
    BufSize := SizeOf(Conns);
    RasResult := RasEnums(@Conns, BufSize, NumConns);
    if (RasResult = 0) or (Result = cERROR_BUFFER_TOO_SMALL) then Result := NumConns;
  finally
    FreeLibrary(RasDLL);
  end;
end;

procedure delay(msec:longint);
var
start,stop:longint;
begin
start := gettickcount;
repeat
stop := gettickcount;
application.processmessages;
until (stop - start ) >= msec;
end;

procedure TForm1.SendenClick(Sender: TObject);
label Ende;
label INet;
label Einwahl;
var
  Status: TConnectionType;
  sMsg: string;
begin
  Status := ConnectedToInternet;
  if Status = ctDialup then goto INet;
  if Status = ctNone then goto Einwahl;
  if Status = ctProxy then goto Einwahl;
  ShowMessage(string(sMsg));
  goto Einwahl;
Einwahl:;
If MessageDlg('Sie sind nicht mit dem Internet verbunden!'#13'       möchten Sie sich jetzt einwählen?',
   mtConfirmation, [mbYes, mbNo], 0) = mrYes
   then
   InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE or INTERNET_AUTODIAL_FORCE_UNATTENDED, 0)
   else goto Ende;
delay(10000);
INet:;
Ende:;
end;

end.


(09.01. 08:49 Tino) Code-Tags hinzugefügt.


Delete - Do 09.01.03 09:40

F.Art hat folgendes geschrieben:
Müsste was gekürzt werden.

Ach, findest du? :mrgreen: Ich benutze folgende Funktion in einem aktuellen Projekt, wobei ich zwar den Online-Status checke, aber zur Sicherheit auch nach einem Mailserver suche. Man kann natürlich auch eine URL angeben und erhält dann deren IP:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
uses
  WinInet, WinSock;

function IsOnline(const szUrl: string; var UrlIp: dword): boolean;
var
  hostent    : pHostent;
begin
  // Internetverbindung prüfen
  Result     := (InternetGetConnectedState(nil,0));
  UrlIp      := 0;

  // angeblich gibt´s eine
  if(Result) then begin
    // zur Sicherheit: URL testen
    hostent  := gethostbyname(@szUrl[1]);
    // tatsächlich; es gibt eine Verbindung
    Result   := hostent <> nil;

    // ok, dann will ich die IP zur URL haben
    if(Result) then
      UrlIp  := integer(pointer(hostent^.h_addr_list^)^);
  end;
end;

Achtung! Die IP wird in der "network byte order" zurückgegeben, da ich sie so auch zum Verbinden mit dem Mail-Server brauche.

Edit-PS: "WsaStartup" und "WsaCleanup" nicht vergessen. Habe ich nicht in obigem Code, weil beide Anweisungen im Hauptteil des Programms stehen. Damit die Sache (sprich: "gethostbyname") auch klappt, muss das noch ins Programm bzw. in die Funktion:

Quelltext
1:
2:
3:
4:
5:
6:
if(WsaStartup(MAKEWORD(1,1),wsadata) = 0) then
try
  { ... }
finally
  WsaCleanUp;
end;


bf109g.01 - Mo 13.02.12 19:46

user profile iconMathiasSimmack hat folgendes geschrieben Zum zitierten Posting springen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
uses
  WinInet, WinSock;

function IsOnline(const szUrl: string): boolean;
var
  hostent    : pHostent;
begin
  // Internetverbindung prüfen
  Result     := (InternetGetConnectedState(nil,0));
  UrlIp      := 0;

  // angeblich gibt´s eine
  if(Result) then begin
    // zur Sicherheit: URL testen
    hostent  := gethostbyname(@szUrl[1]);
    // tatsächlich; es gibt eine Verbindung
    Result   := hostent <> nil;

  end;
end;


Hallo, ich habe gerade genauso ein problem. Ich habe jetzt den Programmcode so ^^ eingefügt, und rufe ihn so auf:

Delphi-Quelltext
1:
If IsOnline('http://www.google.de/')=true then                    


Es macht aber keinen Unterschied. Wenn ich "=true" frage, ist es immer true, wenn ich "=false" frage, ist es immer false. Was habe ich daran nicht verstanden?


Martok - Mo 13.02.12 20:41

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Es macht aber keinen Unterschied. Wenn ich "=true" frage, ist es immer true, wenn ich "=false" frage, ist es immer false. Was habe ich daran nicht verstanden?
Dass man nicht auf [http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/typische-anfaengerfehler/] true vergleicht [http://www.delphi-forum.de/viewtopic.php?p=548760#548760].


bf109g.01 - Di 14.02.12 16:12

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Dass man nicht auf [http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/typische-anfaengerfehler/] true [url=http://www.delphi-forum.de/viewtopic.php?p=548760#548760]vergleicht[/url].

Danke für den Hinweis. Allerdings ist das Problem nach Korrektur dieses Schönheitsfehlers noch immer das gleiche.
Ich bin per WLAN verbunden und die Überprüfung liefert nun immer false als Rückgabewert.

Ich rufe die Funktion jetzt so auf:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
      If not IsOnline('http://www.google.de/'then
          begin
            Textfarbe(5); Write('ERROR:'); Textfarbe(7);
            WriteLN(' No internet connection.');WriteLN;
          end
        else
          begin
            WriteLN('+ Internet connection established.');WriteLN;


Jetzt bekomme ich immer:
"No internet connection" angezeigt. Kann es sein, dass die URL nicht richtig übergeben wird?


Nersgatt - Di 14.02.12 16:29

Die Funktion nutzt doch "GetHostByName". Zum Host gehört aber keinesfalls das Protokoll (http).
Versuch also mal die Funktion nur mit google.de aufzurufen.


Horschdware - Di 14.02.12 16:48

So am Rande... http://www.marian-aldenhoevel.de/dojo/internet.html


bf109g.01 - Di 14.02.12 20:36

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Versuch also mal die Funktion nur mit google.de aufzurufen.

Probiert und geht nicht. :(
Was jetzt?


Narses - Di 14.02.12 22:46

Moin!

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Was jetzt?
Um es kurz zu machen: man kann nicht zweifelsfrei erkennen, ob ein Rechner mit "dem Internet" verbunden ist, aus den verschiedensten Gründen. Das einzig sinnvolle ist den User zu fragen ob eine Internetverbindung möglich ist (sein sollte? oder erlaubt ist?) und dann den Zugriff probieren. :idea:

Es gibt offensichtlich wirklich immer noch Leute, die nicht wissen, dass ein Verbindungstest erst der Auslöser für einen Verbindungsaufbau ist, und dass es komische Tarifmodelle gibt, die sowas gar nicht lustig finden... :idea: :|

cu
Narses


Tastaro - Mi 15.02.12 08:36

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Versuch also mal die Funktion nur mit google.de aufzurufen.

Probiert und geht nicht. :(
Was jetzt?


Der Rechner der angesprochen werden soll "heißt" nicht http://www.google.de und auch nicht google.de, sondern http://www.google.de.