Ich mache es so:
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