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
MathiasSimmack hat folgendes geschrieben : |
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?
bf109g.01 - Di 14.02.12 16:12
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.
bf109g.01 - Di 14.02.12 20:36
Nersgatt hat folgendes geschrieben : |
Versuch also mal die Funktion nur mit google.de aufzurufen. |
Probiert und geht nicht. :(
Was jetzt?
Narses - Di 14.02.12 22:46
Moin!
bf109g.01 hat folgendes geschrieben : |
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
bf109g.01 hat folgendes geschrieben : |
Nersgatt hat folgendes geschrieben : | 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!