Autor Beitrag
Donny
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 28.12.02 18:55 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 28.12.02 20:10 
Vielleicht ist ja das was Du suchst:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Windows2000 Prof. SP4
Delphi7 Enterprise
BeitragVerfasst: So 29.12.02 14:35 
Ich mache es so:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Windows2000 Prof. SP4
Delphi7 Enterprise
BeitragVerfasst: Fr 03.01.03 16:46 
Allerdings geht es auch noch kürzer :oops:
(Die Idee kam mir heute erst (aber nicht nochmal :oops: )

ausblenden 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