AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke IsHostAlive mit XE2 - Unklare Fehler / Warnungen
Thema durchsuchen
Ansicht
Themen-Optionen

IsHostAlive mit XE2 - Unklare Fehler / Warnungen

Ein Thema von Piro · begonnen am 12. Mär 2014 · letzter Beitrag vom 28. Feb 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#1

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 12. Mär 2014, 19:58
Tja, das kommt davon, wenn falsche Typen verwendet werden.

Das hat gefälligst ein Cardinal, DWORD oder Dergleichen zu sein, wie man am MSDN-Library durchsucheninet_addr sehen kann.

Es wurde aber als Integer definiert und ein Integer kann nunmal "logisch" niemals den Wert $FFFFFFFF (4294967295 ) enthalten.
OK, binär wäre es die -1, aber eine Compiler, welcher genau auf die Typen achtet, wird bei diesem Vergleich beide Typen auf Int64 erweitern.
Und da er die Grenzen des Integers kennt, gibt er natürlich die Warnung aus, daß ein Vergleich niemals zutreffen wird, da es den Wert halt nicht geben kann.
Lösung: if DWORD(Addr) <> INADDR_NONE then , oder man berichtigt eben die Typen.


Ich hab auch gleich noch ein paar andere Typen angepasst (THandle statt Cardinal usw.)
Und melde gleich meine Antwort, so daß der CodeLib-Eintrag berichtigt wird.

Quelle: http://www.delphipraxis.net/126574-i...rreichbar.html

PS: Genau aus solchen Gründen, also wegen falschen Typen gibt es die meisten Probleme, vorallem bei solchen Umstellungen wie von ANSI zu Unicode oder von Win32 auf Win64.

Delphi-Quellcode:
unit hostalive;

interface

uses
  Windows, Winsock; // Winapi.Windows, Winapi.Winsock;

function IsHostAlive(Hostname: String; pTripTime: PCardinal=nil; Timeout: Integer=1000; TTL: Integer=255): Boolean;

implementation

type
  IP_OPTION_INFORMATION = packed record
    TTL: Byte;
    TOS: Byte;
    Flags: Byte;
    OptionsSize: Byte;
    OptionsData: PAnsiChar;
  end;
  PIP_OPTION_INFORMATION = ^IP_OPTION_INFORMATION;

  ICMP_ECHO_REPLY = packed record
    Address: in_addr;
    Status: Cardinal;
    RoundTripTime: Cardinal;
    DataSize: Word;
    Reserved: Word;
    Data: Pointer;
    Options: IP_OPTION_INFORMATION;
  end;
  PICMP_ECHO_REPLY = ^ICMP_ECHO_REPLY;

function IcmpCreateFile: THandle; stdcall; external 'Iphlpapi.dll';
function IcmpCloseHandle(IcmpHandle: THandle): Boolean; stdcall; external 'Iphlpapi.dll';
function IcmpSendEcho(IcmpHandle: THandle; DestinationAddress: Cardinal; RequestData: Pointer; RequestSize: Word; RequestOptions: PIP_OPTION_INFORMATION; ReplyBuffer: Pointer; ReplySize: Cardinal; Timeout: Cardinal): Cardinal; stdcall; external 'Iphlpapi.dll';

function ResolveHost(Hostname: AnsiString): Cardinal;
var
  HostInfo: PHostEnt;
  T: ^PInAddr;
begin
  Result := inet_addr(PAnsiChar(Hostname));
  if Result = INADDR_NONE then begin
    HostInfo := gethostbyname(PAnsiChar(Hostname));
    if Assigned(HostInfo) then begin
      T := Pointer(HostInfo^.h_addr_list);
      if Assigned(T) and Assigned(T^) then
        Result := T^^.S_addr;
    end;
  end;
end;

function IsHostAlive(Hostname: String; pTripTime: PCardinal; Timeout, TTL: Integer): Boolean;
const
  SendBuffer: array[0..31] of AnsiChar = 'pingpongpingpongpingpongpingpong';
var
  WSA: TWSADATA;
  Reply: PICMP_ECHO_REPLY;
  Addr: Cardinal;
  hIcmp: THandle;
  Options: IP_OPTION_INFORMATION;
begin
  Result := False;
  FillChar(Options, SizeOf(IP_OPTION_INFORMATION), #0);
  Options.TTL := TTL;
  Options.TOS := 1;
  if WSAStartUp(((0 shl 8) + 2), WSA) = 0 then begin
    Addr := ResolveHost(AnsiString(Hostname));
    if Addr <> INADDR_NONE then begin
      hIcmp := IcmpCreateFile;
      if hicmp <> INVALID_HANDLE_VALUE then begin
        Reply := nil;
        try
          Reply := AllocMem(SizeOf(ICMP_ECHO_REPLY) + SizeOf(SendBuffer));
          IcmpSendEcho(hIcmp, Addr, @SendBuffer[0], SizeOf(SendBuffer), @Options, Reply, SizeOf(ICMP_ECHO_REPLY) + SizeOf(SendBuffer), Timeout);
          Result := Reply^.Status = 0;
          if Result and Assigned(pTripTime) then
            pTripTime^ := Reply^.RoundTripTime;
        finally
          IcmpCloseHandle(hIcmp);
          if Assigned(Reply) then
            FreeMem(Reply);
          WSACleanup;
        end;
      end;
    end else begin
      // Hostname konnte nicht aufgelöst werden.
      WSACleanup;
    end;
  end else begin
    // Winsock konnte nicht gestartet werden.
  end;
end;

end.
Delphi-Quellcode:
var
  RTT: Cardinal;
begin
  if IsHostalive('google.de', @RTT) then
    ShowMessage(IntToStr(RTT) + 'ms');
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Mär 2014 um 21:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#2

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 12. Mär 2014, 20:38
!!! VIELEN DANK !!!

Das hat geklappt, jetzt ist wieder alles erreichbar. Dieses Forum und seine Mitglieder sind der Hammer und haben mir schon mehr als einmal aus der Klemme geholfen.

Schönen Abend noch.

@himitsu : 1000 Danke nochmal
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 28. Feb 2015, 16:13
@ himitsu

IsHostalive('google.com', @RTT) gibt immer True zurück.

IsHostalive('microsoft.com', @RTT) gibt immer False zurück.

WARUM?

Delphi XE7

EDIT:

Wenn ich aber die IP-Adresse von microsoft.com (95.100.79.156) verwende, wird True zurückgegeben:

IsHostalive('95.100.79.156', @RTT) gibt immer True zurück.

Wieso funktioniert es also mit microsoft.com nicht?

Geändert von PeterPanino (28. Feb 2015 um 16:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#4

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 28. Feb 2015, 16:34
IsHostalive('google.com', @RTT) gibt immer True zurück.

IsHostalive('microsoft.com', @RTT) gibt immer False zurück.

WARUM?
Weil Google auf ICMP-Requests antwortet, Microsoft aber nicht. Letzteres ist übrigens typisch für die, denn standardmäßig antwortet kein Windows seit XP SP2 mehr auf ICMP-Requests, weil das in der Firewall (schwachsinnigerweise) abgeschaltet ist.

Zitat:
Wenn ich aber die IP-Adresse von microsoft.com (95.100.79.156) verwende, wird True zurückgegeben:

IsHostalive('95.100.79.156', @RTT) gibt immer True zurück.

Wieso funktioniert es also mit microsoft.com nicht?
Schau dir mal mit nslookup oder Webseiten wie IP2Geolocation an, auf welchen Namen die IP-Adressen auflösen, dann siehst du, dass hinter dieser IP Akamai steckt, nicht Microsoft (IP2Geolocation).

MfG Dalai

Geändert von Dalai (28. Feb 2015 um 16:36 Uhr)
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 28. Feb 2015, 16:41
... standardmäßig antwortet kein Windows seit XP SP2 mehr auf ICMP-Requests, weil das in der Firewall (schwachsinnigerweise) abgeschaltet ist.
Schutz gegen Port-Scans?

Kann ich aber sonst davon ausgehen, dass IsHostalive mit allen anderen "normalen" Domain-Namen IM INTERNET funktioniert?
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 28. Feb 2015, 17:04
Übrigens: Wenn ich IsHostalive mit einem leeren string aufrufe, gibt es immer True mit 0 ms zurück!

IsHostalive('', @RTT)

WARUM?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#7

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 28. Feb 2015, 17:21
Übrigens: Wenn ich IsHostalive mit einem leeren string aufrufe, gibt es immer True mit 0 ms zurück!

IsHostalive('', @RTT)

WARUM?
Weil die intern verwendete Funktion gethostbyname dann localhost verwendet.

Zitat:
If the name parameter points to an empty string or name is NULL, the returned string is the same as the string returned by a successful gethostname function call (the standard host name for the local computer).
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#8

AW: IsHostAlive mit XE2 - Unklare Fehler / Warnungen

  Alt 28. Feb 2015, 17:24
... standardmäßig antwortet kein Windows seit XP SP2 mehr auf ICMP-Requests, weil das in der Firewall (schwachsinnigerweise) abgeschaltet ist.
Schutz gegen Port-Scans?
Schutz? Wenn ein Script-Kiddie mit automatisierten dumpfen Tools daherkommt, schützt das vielleicht. Aber doch nicht gegen Leute, die ernsthaft irgendwo Schaden anrichten wollen. Dagegen erschwert es - wie du nun selbst festgestellt hast - simpelste Diagnosen, weil ein Ping ins Leere läuft. Aber darüber kann man endlos diskutieren, und da es OT ist, belasse ich es dabei.

Zitat:
Kann ich aber sonst davon ausgehen, dass IsHostalive mit allen anderen "normalen" Domain-Namen IM INTERNET funktioniert?
Nö, weil manche Leute genau dieselbe Ansicht wie Microsoft vertreten und ICMPs verwerfen und nicht darauf antworten. Das kann man vorher nicht wissen. Die meisten antworten sauber auf Pings.

Übrigens: Wenn ich IsHostalive mit einem leeren string aufrufe, gibt es immer True mit 0 ms zurück!

IsHostalive('', @RTT)

WARUM?
Keine Ahnung. Hast du mal durch den Code gesteppt mit verschiedenen übergebenen Strings/Domains? Aber ich sehe, da kam gerade noch eine andere Antwort dazwischen.

MfG Dalai
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 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