Entwickler-Ecke
Internet / Netzwerk - ONLINE? Hier die Lösung auch für XP
SevenValues - Do 25.09.03 16:28
Titel: ONLINE? Hier die Lösung auch für XP
Damit das leidige Thema ein Ende findet. Ich war auch am Rande der Verzweiflung, als ich herausfinden wollte, ob mein Rechner online ist.
Nichts hat geholfen (!!!!! AUCH WinInet.GetConnectedState(NIL, 0) hat nichts genützt !!!!!!) Für all die Schlaumeier, die GetConnectedState für ein Allheilmittel in Sachen Onlinestatus halten: unter XP kannste das gleich wieder knicken!!!
Hier die Lösung:
Delphi-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:
| unit CheckInternetConnection1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Registry, WinSock, WinInet;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); 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;
function ConnectedToInternet: TConnectionType; function RasConnectionCount: Integer;
implementation
{$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 TForm1.Button1Click(Sender: TObject); var Status: TConnectionType; sMsg: string; begin Status := ConnectedToInternet; if Status = ctDialup then sMsg := 'Im Internet!'; if Status = ctNone then sMsg := 'Nicht im Internet!'; if Status = ctProxy then sMsg := 'Proxyserver'; ShowMessage(string(sMsg)); end;
end. |
Grüße
7
Moderiert von
UGrohne: Code- durch Delphi-Tags ersetzt
BungeeBug - Do 25.09.03 18:00
Hi,
dann is da immer noch das Problem mit dem Router :)
Nich das ich deine Lösung schlecht machen will, aber evl. kannst du dir da ja auch noch was einfallen lassen :)
SevenValues - Do 25.09.03 20:12
Ich glaube Du bist der, der DSL und zwei Rechner am Router hängen hat und sich das Einwählen sparen will, wenn der eine Rechner bereits Online ist, oder?
Ich habe bereits darüber nachgedacht, allerdings wirst Du da wohl nicht drumherum kommen auf jedem Rechner einen Onlinechecker laufen zu lassen und diese beiden Onlinechecker miteinander kommunizieren zu lassen. Ähnlich wie eine True - False - Auswertung. Rechner 1: Ich bin online und petze das jetzt Rechner 2. Rechner 2 ist beleidigt und sperrt das Autodial auf Rechner 2. Dann wählt sich Dein Onlinenutzungsprogramm, wie Outlook oder Netscape nicht mehr automatisch ein.
Grüße
7
BungeeBug - Do 25.09.03 21:55
Hi,
nein ich bin nicht der ... ich würd nie auf die abartige Idee kommen sowas zubasteln ;)
Aber ich hab nen Router. Und dein Tool sagt mir online egal was ich mache. Ganz einfacht weil ich ne Netzwerkverbindung an hab. Aber es soll auch Leute geben die nur nen Netzwerk haben :)
SevenValues - Fr 26.09.03 11:15
Wie stellst Du denn Deine Netzwerkverbindung her? Doch wohl nicht über Modem oder? Der Onlinestatus wird über die rasapi32.dll gecheckt. Die nutzt Du mit Sicherheit nicht, wenn Dein Netzwerk aktiviert wird. Es sei denn, Du wählst Dich via Modem in Dein Netzwerk ein, d.h. Deine kompletten Netzwerkverbindungen wären dann Modemverbindungen.
Ich hab XP mit zwei Rechnern, die zwar nicht über nen Router verbunden werden (warum auch), aber das Prinzip sollte das selbe sein. Vielleicht stimmt mit Deiner Auswertung da was nicht?
Grüße
7
PS:
Was hast Du eigentlich vor??
BungeeBug - Fr 26.09.03 14:49
Ich hab garnix vor. ich wollte dich nur drauf hinweisen das wenn jmd. eine Netzwerkverbindung ins INet hat es zur folge hat das dein Tool die LAN IP wieder gibt. Nicht mehr und nicht weniger. Vielleicht lässt sich auch da noch was machn, das man zumindest feststellt das das ganze in einem netzwerk ist und nich im INet. Ich kenne genug Leute die auf die Frage "Wie ist deine IP" antworten 192...... und dem soll dadurch vorgegriffen werden. Verstehst du was ich meine? Ich denke es wird für dich bedeuten einfach das Standartgarteway auslesen und dann ganz pauschal feststellen das das auslesen der INet IP nicht möglich ist.
SevenValues - Fr 26.09.03 15:52
Hm..
Nur mit dem Problem, daß mein Tool keine IPs ausgibt, sondern am Rechner, der Online ist lediglich feststellt, ob er online ist.
Du hast in sofern recht, als daß man am Client-Rechner (also an dem Rechner, der im Netzwerk, aber NICHT am Internet hängt) die IP der Online-Verbindung nicht feststellen kann. Das kann dem Client-Rechner aber ein lauschprogramm übermitteln. Im Grunde ist das Tool da oben nichts weiter als ein Tool, das am Internetrechner den Onlinezustand feststellt. Letztenendes kann man doch mit den beiden Units machen, was man will. Man könnte z.B. per Indy die IP der Onlineverbindung übermitteln. Wie man die IP herausbekommt ist in diesem Forum divers dargestellt worden. Man sollte halt eben nur darauf auchten, daß die WinAPI von Betriebssystem zu Betriebssystem verschieden ist und daß gerade der Onlinesektor in der WinAPI unterschiedlicher nicht sein kann. Hat wohl mit der immerwährenden Kritik an MS zu tun, der MS ja gerecht werden will. Wohl oder übel MÜSSEN die von MS ja die Onlinefunktionen überarbeiten. Da aber wir beide 2000/XP-User sind, sollten wir schon über das gleiche reden können. Wie mir aber scheint, hast du die functions in der obigen Unit gar nicht ausprobiert, oder? Die gibt keine IP aus.
Natürlich liegt die IP eines Netzwerkrechners (ob mit ICS oder nicht, ob Proxy oder nicht) immer im privaten Bereich - also 192. ... Das ist aber auch gar nicht das Thema. Das Thema ist: Bin ich Online, oder nicht? Dazu steht oben die Lösung. Und zwar gleichermaßen für 2000 wie für XP. Ob das bei 98 funktioniert weiß ich jetzt gar nicht so genau und 95 - naja, wer nutzt schon noch 95???
Grüße
7
Chris1308 - Fr 26.09.03 21:37
Hi,
das es nicht klappt, wenn man hinter einem Router sitzt stimmt.
Und wie soll das bitte auch gehen? Du liest die RAS-Connection aus. Das hilft dir aber nicht, wenn jemand per Gateway ins Internet geht (also per Router).
Wie BungeeBug schon gesagt hat: in diesem Fall muss derjenige den Standardgateway auslesen und dort prüfen, ob eine Verbindung besteht. Wobei letzteres schwierig wird, weil nicht gesagt ist, dass auf jedem Router bspw. fli4l drauf ist.
Chris
SevenValues - Sa 27.09.03 00:59
Achso - Achso - Achso!
An diese Leute ist ja diese Unit eigentlich auch nicht gerichtet. Jetzt verstehe ich erstmal, worauf Bungee hinaus will!
Hoppla!
In dem Falle wird tatsächlich nur auf die RAS-Connection aufgeprüft und per Routernetzwerk ist ja dann jeder Compi im Grunde "nur" ein Client und der Router der Host. Dann funzt das ganze nicht, es sei denn man nutz einen Compi als Router, aber dann wirds wirklich kompliziert. Da fällt mir spontan auch nur ein Ping nach google.de ein oder so. Da der Server aber auch mal nicht verfügbar sein kann, ist das auch schonwieder Asche!
Ich denke mal darüber nach und belese mich mal.
Grüße
7
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!