Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Überprüfen ob ein 'Server' online ist (https://www.delphipraxis.net/130246-ueberpruefen-ob-ein-server-online-ist.html)

bl4ckb1rd 5. Mär 2009 13:03


Überprüfen ob ein 'Server' online ist
 
Wie kann ich mit Delphi überprüfen, ob ein Server ( IP = DynDNS -> z.b. arm1.ath.cx) online oder offline ist. Ohne Delphi würde ich die Konsole öffnen und eingeben : ping arm1.ath.cx wenn ich antworten bekommen so ist der SErver online, wenn nicht ist er offline. In Delphi möchte ich aber haben das wenn ich auch einen Button ('Check') drücke, Delphi selbst überprüfft ob der Server online/offline ist. Das Ergebnis soll dann in einem Label erscheinen.

Ich habe noch nie Netzwerk Programmierung gemacht und weiß auch gar nicht mit was ich da anfagen soll, welche Komponenten ich überhaupt da benutzen sollte.



Meine 2te Frage hat eig. mit Netzwerken nix zu tun: Wie kann ich mithilfe von Delphi ein anderes Programm mit 'Startparametern' starten? D.h. ich geb den Pfad der Exe Datei in ein Edit-Feld ein, und Delphi startet die Exe mit Startparametern.

Konkretes Beispiel: Ich geb den Pfad von Call of Duty 4 ein, und wenn ich auf z.b: connect drücke, so wird die Exe mit folgenden Startparametern ausgeführt: +connect IP. So starte ich das Spiel und connecte sofort zu einem Server ohne vorher in das Hauptmenü des Spiels zu kommen.



Wäre sehr dankbar wenn mir jemand helfen könnte :-D

Bernhard Geyer 5. Mär 2009 13:05

Re: Überprüfen ob ein 'Server' online ist
 
Genau so wie "per Hand": Du nimmst eine Ping-Komponente der ICS oder von Indy oder von ... und pinst deinen Server an.

Phoenix 5. Mär 2009 13:08

Re: Überprüfen ob ein 'Server' online ist
 
Zitat:

Zitat von bl4ckb1rd
Meine 2te Frage hat eig. mit Netzwerken nix zu tun

Mache deswegen bitte für jede einzelne Frage einen eigenen Thread in der richtige Sparte auf.
Wobei Du in dem konkreten Fall bitte erstmal hier in der DP nach Hier im Forum suchenShellExecute Parameter suchen solltest. Da wirst Du alles nötige finden.

bl4ckb1rd 5. Mär 2009 14:28

Re: Überprüfen ob ein 'Server' online ist
 
also meine 2te FRage habe ich gelöst funktionier wunderbar :D

Nur der erste Teil, also eine IP anpingen, da weiß ich immer noch nicht wie ich vorgehen muss, welche Komponente ich genau benutzen soll, und wie ich das ergebnis auswerten kann o.O

Bernhard Geyer 5. Mär 2009 14:30

Re: Überprüfen ob ein 'Server' online ist
 
Zitat:

Zitat von bl4ckb1rd
..., da weiß ich immer noch nicht wie ich vorgehen muss, welche Komponente ich genau benutzen soll, und wie ich das ergebnis auswerten kann o.O

ICS herunterladen, installieren und PING-Demo anschauen. Dann solltest du es entsprechend deinen Anforderungen nachbauen können

himitsu 5. Mär 2009 14:56

Re: Überprüfen ob ein 'Server' online ist
 
einfach eine kleine Datei runterzuladen ginge nicht?

bl4ckb1rd 5. Mär 2009 15:05

Re: Überprüfen ob ein 'Server' online ist
 
hmm also wenn ich versuch die ICS datei (IcsDel110.dproj) zu installieren kommt bei mir folgender fehler bei der datei wsocket.pas zeile 2336:

Delphi-Quellcode:
if not WSocketGForced then begin
            WSocketGForced := TRUE;  // Der Linken Seite kann nix zugewiesen werden ;(
            Inc(WSocketGCount);
            WSocketGetProc('');
        end;

Das kann aber glaube ich daran liegen das ich Delphi 2009 benutze oder?

Gibt es eine Alternative zu ICS und anpingen?

Luckie 5. Mär 2009 15:06

Re: Überprüfen ob ein 'Server' online ist
 
Wenn ein Ping erfolgreich war, heißt das aber noch lange nicht, ob die benötigten Dienste (http, ftp, ..) auch verfügbar sind.

bl4ckb1rd 5. Mär 2009 15:08

Re: Überprüfen ob ein 'Server' online ist
 
Also wenn Ping geht, dann ist ja der andere PC im Internet oder?

Oder wie kann ich testen ob jetzt ein Spiel-Server (in diesem Fall Call of Duty 4) mit der DyDNS arm1.ath.cx und Port 28960 online ist?

Luckie 5. Mär 2009 15:18

Re: Überprüfen ob ein 'Server' online ist
 
Zitat:

Zitat von bl4ckb1rd
Also wenn Ping geht, dann ist ja der andere PC im Internet oder?

Um es mal etwas fachlicher auszudrücken: Dann ist der Rechner über das Internet erreichbar. aber wie gesagt, ob der gewünschte Dienst läuft ist eine andere Sache. Aber auch andersrum, das heißt, wenn der Ping fehlgeschlagen ist, heißt das nicht, dass der Rechner nicht online ist. Eventuell reagiert er nur nicht auf Pings.

himitsu 5. Mär 2009 15:27

Re: Überprüfen ob ein 'Server' online ist
 
jupp, das war bei meinem Anbiter damals.

der Server war erreichbar, aber PHP verreckte öfters mal.

da hatte ich dann mal 'ne Zeit lang eine Datei (z.B. html) geladen und dann noch eine PHP-Datei ausführen lassen und bei beidem prüfte ich dann den Inhalt ... vorallem das Script lieferte mir von der URL(einem Parameter) abhängige Inhalte und so konnte ich prüfen ob deses auch lief.

also der Server war immer ereichbar, aber PHP und manchmal auch http selbst versagte. (interne Serverprobleme)

bl4ckb1rd 5. Mär 2009 17:52

Re: Überprüfen ob ein 'Server' online ist
 
Was schlägt ihr mir dann vor wie ich kontrollieren kann ob der 'andere' PC online ist und auch reagiert?

Wenns hilf, genauere Info: Mit Server ist der Spiel-Server Call of Duty 4 gemeint. Weiß jemand wie ich dann überprüfen kann ob dieser online ist? IP + Port vom Server: arm1.ath.cx:28960

Luckie 5. Mär 2009 18:06

Re: Überprüfen ob ein 'Server' online ist
 
Es wurden dir doch schon genug Möglichkeiten genannt. Wo ist jtzt das Problem?

bl4ckb1rd 5. Mär 2009 20:23

Re: Überprüfen ob ein 'Server' online ist
 
Hab jetzt eine Unit gefunden mit der ich eine IP anpingen kann. Doch wenn ich diese Unit compiliere spuckt mir der Compiler folgende Fehler Meldung aus: [DCC Fehler] Unit2.pas(79): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'

Betroffen ist die Zeile 79 (phe := GetHostByName(PChar(AIP));) phe ist PHostEnt

Und hier ist die ganze Unit die ich gefunden habe und gerne benutzen würde:

Delphi-Quellcode:
unit Unit2;

interface
uses
  Windows, SysUtils, Classes;

type
  TSunB = packed record
    s_b1, s_b2, s_b3, s_b4: byte;
  end;

  TSunW = packed record
    s_w1, s_w2: word;
  end;

  PIPAddr = ^TIPAddr;
  TIPAddr = record
    case integer of
      0: (S_un_b: TSunB);
      1: (S_un_w: TSunW);
      2: (S_addr: longword);
  end;

 IPAddr = TIPAddr;

function IcmpCreateFile : THandle; stdcall; external 'icmp.dll';
function IcmpCloseHandle (icmpHandle : THandle) : boolean;
            stdcall; external 'icmp.dll';
function IcmpSendEcho
   (IcmpHandle : THandle; DestinationAddress : IPAddr;
    RequestData : Pointer; RequestSize : Smallint;
    RequestOptions : pointer;
    ReplyBuffer : Pointer;
    ReplySize : DWORD;
    Timeout : DWORD) : DWORD; stdcall; external 'icmp.dll';


function Ping(InetAddress : string) : boolean;

implementation

uses
  WinSock;

function Fetch(var AInput: string;
                      const ADelim: string = ' ';
                      const ADelete: Boolean = true)
 : string;
var
  iPos: Integer;
begin
  if ADelim = #0 then begin
    // AnsiPos does not work with #0
    iPos := Pos(ADelim, AInput);
  end else begin
    iPos := Pos(ADelim, AInput);
  end;
  if iPos = 0 then begin
    Result := AInput;
    if ADelete then begin
      AInput := '';
    end;
  end else begin
    result := Copy(AInput, 1, iPos - 1);
    if ADelete then begin
      Delete(AInput, 1, iPos + Length(ADelim) - 1);
    end;
  end;
end;

procedure TranslateStringToTInAddr(AIP: string; var AInAddr);
var
  phe: PHostEnt;
  pac: PChar;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  try
    phe := GetHostByName(PChar(AIP));
    if Assigned(phe) then
    begin
      pac := 'phe^.h_addr_list^';
      if Assigned(pac) then
      begin
        with TIPAddr(AInAddr).S_un_b do begin
          s_b1 := Byte(pac[0]);
          s_b2 := Byte(pac[1]);
          s_b3 := Byte(pac[2]);
          s_b4 := Byte(pac[3]);
        end;
      end
      else
      begin
        raise Exception.Create('Error getting IP from HostName');
      end;
    end
    else
    begin
      raise Exception.Create('Error getting HostName');
    end;
  except
    FillChar(AInAddr, SizeOf(AInAddr), #0);
  end;
  WSACleanup;
end;

function Ping(InetAddress : string) : boolean;
var
 Handle : THandle;
 InAddr : IPAddr;
 DW : DWORD;
 rep : array[1..128] of byte;
begin
  result := false;
  Handle := IcmpCreateFile;
  if Handle = INVALID_HANDLE_VALUE then
   Exit;
  TranslateStringToTInAddr(InetAddress, InAddr);
  DW := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 128, 0);
  Result := (DW <> 0);
  IcmpCloseHandle(Handle);
end;

end.

himitsu 5. Mär 2009 20:34

Re: Überprüfen ob ein 'Server' online ist
 
dann sachau doch mal nach was GetHostByName für einen Parameter haben möchte (ich vermute mal einen PAnsiChar und du übergibst PChar)


PS: du solltest deine Delphi-Version mal ins DP-Profil eintragen, oder diese in bei deinen Fragen mit erwähnen.
(diese Angabe ist nicht nur zum Angeben, sondern damit man weiß auf welches System man seine Antworten beziehen muß)

Aber ich bin mir sicher daß du D2009 (richtig getippt?) nutzt und da ist ... PChar = PWideChar

bl4ckb1rd 5. Mär 2009 21:16

Re: Überprüfen ob ein 'Server' online ist
 
ok problem gelöst, ich benutzte d2009, richgitg geraten :D, und habe auch überal pcahr mit pansichar ersetzt.

Nun wenn ich alles starte bekomme ich jedesmal den Fehler: Error getting HostName. Dieser wird nur dann aufgerufen wenn Assigned(phe) false ist. Keine Ahnung was Assigned(phe) heißt o.O

Ich habe die DynDNS arm1.ath.cx eingeben -> ging nicht
Auch mit der IP die sich hinter arm1.ath.cx befindet gehts auch
sogar 127.0.0.1 nimmt er auch nicht an o.O

himitsu 5. Mär 2009 21:18

Re: Überprüfen ob ein 'Server' online ist
 
Zitat:

Zitat von bl4ckb1rd
ok problem gelöst, ich benutzte d2009, richgitg geraten :D, und habe auch überal pcahr mit pansichar ersetzt.

du hast aber auch den zugehörigen String geändert?

Assigned(phe) entspricht phe <> nil

bl4ckb1rd 5. Mär 2009 21:30

Re: Überprüfen ob ein 'Server' online ist
 
wie soll ich den dazugehörigen string ändern?

Bei mir sieht das ganz so aus:
Delphi-Quellcode:
pac: PAnsiChar;
und weiter unten:

Delphi-Quellcode:
phe := GetHostByName(PAnsiChar(AIP));
vorher sah das so aus:

Delphi-Quellcode:
pac: PChar;
und

Delphi-Quellcode:
phe := GetHostByName(PChar(AIP));

himitsu 5. Mär 2009 21:46

Re: Überprüfen ob ein 'Server' online ist
 
PChar + AIP als String

PAnsiChar + AIP als AnsiString

aber eigentlich sollte Delphi da auch meckern, wenn man PAnsiChar auf einen String/WideString/UnicodeString anwendet

bl4ckb1rd 6. Mär 2009 13:23

Re: Überprüfen ob ein 'Server' online ist
 
Klasse!!!!!!!!!!!!!!!!!!!!!!

Alles funktioniert suuuuper :D

Größten DANK!!!!!!!!!!!!!


:dp: :dp: :dp: :dp: :dp:

:bounce2: :bounce2: :bounce2:

BackOrifice 6. Mär 2009 13:38

Re: Überprüfen ob ein 'Server' online ist
 
Äh Moment mal.

Ping ist nur ein Programm von Microsoft, welches ICMP Requests abruft. Wenn der Host/Server aber nicht auf ICMP Requests antwortet, dann heißt das nochlange nicht, dass der Host nicht verfügbar ist. In jeder gescheiten Firewall kann man einstellen, ob ein ICMP Replys gesendet werden sollen.

Und wie das hier einer schon bemerkte: Wenn ein Reply zurückkommt, heißt das noch lange nicht, dass der Dienst auf dem Host auch antwortet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz