Entwickler-Ecke
Internet / Netzwerk - Verbindung zum Internet aktiv?
Donny - Sa 28.12.02 18:55
Titel: Verbindung zum Internet aktiv?
Hallo,
ich brauche eine Methode, mit der ich rausbekomme, ob mein Computer sich gerade zum Internet verbunden hat oder schon ist. Zwar weiß ich, dass es z.B. die Funktion InternetGetConnectedState gibt, doch leider habe ich rausgefunden, dass man mit ihr nicht Netzwerk- und Internetverbindung unterscheiden kann.
Außerdem gibt es da noch die Komponente TidIPWatch in Delphi. Doch ihre Eigenschaft IsOnline ist bei mir ständig auf False, obwohl ich verbunden bin.
Aus dem SwissDelphiCenter habe ich dann noch die Möglichkeit über RAS gefunden. Doch bei ihr habe ich das Problem, dass der Rückgabewert der Funktion schon true ist, wenn ich mich gerade verbinde und da ich dann in meinem Programm eine Verbindung zu einem FTP-Server herstelle, bekomme ich eine Fehlermeldungen (Null Remote Adress) und das Programm bleibt hängen.
Hat jemand vielleicht eine Idee, wie mein Programm zuverlässig läuft, d.h. wie ich 100%ig rausbekomme, dass sich die NMFTP-Komponente verbinden kann?
bis11 - Sa 28.12.02 20:10
Vielleicht ist ja das was Du suchst:
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:
| Function ConnectionKind :boolean; var flags: dword; begin Result := InternetGetConnectedState(@flags, 0); if Result then begin if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then begin showmessage('Modem'); end; if (flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then begin showmessage('LAN'); end; if (flags and INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY then begin showmessage('Proxy'); end; if (flags and INTERNET_CONNECTION_MODEM_BUSY)=INTERNET_CONNECTION_MODEM_BUSY then begin showmessage('Modem Busy'); end; end; end; |
(30.12. 10:50 Tino) Code-Tags hinzugefügt.
Burgpflanze - So 29.12.02 14:35
Ich mache es so:
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:
| unit CheckOnline;
interface
uses Windows, WinSock;
function IsOnline(AOwner: THandle; const AHost: String = 'www.denic.de'; APort: Integer = 80): Boolean;
implementation
procedure ShowError(AOwner: THandle; AErrorCode: Integer); var buf: array[1..MAX_PATH] of Char; begin FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, AErrorCode, 0, @buf, SizeOf(buf), nil); MessageBox(AOwner, @buf, 'CheckOnline - Error', MB_ICONSTOP); end;
function IsOnline(AOwner: THandle; const AHost: String; APort: Integer): Boolean; var error: Integer; wsaData: TWSAData; host_addr: TSockAddrIn; hostent: PHostent; sock: TSocket; begin Result := False;
error := WSAStartUp(MAKEWORD(1, 1), wsaData); if error <> 0 then begin ShowError(AOwner, error); Exit; end;
sock := socket(AF_INET, SOCK_STREAM, 0); if sock = INVALID_SOCKET then begin ShowError(AOwner, WSAGetLastError); Exit; end;
host_addr.sin_family := AF_INET; host_addr.sin_port := htons(APort); host_addr.sin_addr.S_addr := inet_addr(PChar(AHost));
if host_addr.sin_addr.S_addr = INADDR_NONE then begin hostent := GetHostByName(PChar(AHost));
if not Assigned(hostent) then begin ShowError(AOwner, WSAGetLastError); closesocket(sock); Exit; end;
host_addr.sin_addr.s_addr := PInAddr(hostent^.h_addr_list^)^.s_addr; end;
error := connect(sock, host_addr, SizeOf(TSockAddr)); Result := (error <> SOCKET_ERROR);
closesocket(sock); WSACleanUp; end;
end. |
Ich rufe dann nur die Funktion "IsOnline" auf.
Wenn online, dann ist der Rückgabewert True, ansonsten False.
Um ganz sicher zu gehen, kann man, wenn der erste Aufruf False ist, die Funktion ja nochmal mit einem anderen Server aufrufen, denn es kann ja immer mal passieren, das ein Server mal nicht erreichbar ist.
z. B.: IsOnline(Form1.Handle, 'ptbtime1.ptb.de', 37)
(Dieser Server ist einer der beiden Zeitserver der Physikalisch-technischen Universität Braunschweig, deshalb auch Port 37)
AOwner ist das Handle des Formulars, aus welchem die Funktion aufgerufen wird. (Wird nur zur Anzeige der MessageBox bei Fehlern benötigt)
Gruss, Burgpflanze
Burgpflanze - Fr 03.01.03 16:46
Allerdings geht es auch noch kürzer :oops:
(Die Idee kam mir heute erst (aber nicht nochmal :oops: )
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| uses Windows, WinSock;
function IsOnline(Server: String): Boolean; var wsaData: TWSAData; begin WSAStartUp(MAKEWORD(1, 1), wsaData); Result := (GetHostByName(PChar(Server)) <> nil); WSACleanUp; end; |
Gruss, Burgpflanze
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!