Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr.
Seite 2 von 3     12 3      

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