Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [NonVCL, WinInet.InternetReadFile, PHP]: Wo kommt die 0 her? (https://www.delphipraxis.net/63869-%5Bnonvcl-wininet-internetreadfile-php%5D-wo-kommt-die-0-her.html)

Daniel Schuhmann 23. Feb 2006 21:08


[NonVCL, WinInet.InternetReadFile, PHP]: Wo kommt die 0 her?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Servus!

Ich habe ein sehr merkwürdiges Phänomen entdeckt und ich komme einfach nicht dahinter, warum das so ist. Die Geschichte ist allerdings auf einem zweiten Rechner reproduzierbar, an Zufälle glaube ich da nicht mehr.

Worum es geht:
Ich habe mir ein NonVCL-Programm geschrieben, das per HTTP ein PHP-Skript aufruft. Dieses Skript gibt die aktuelle Remote-IP zurück, kann eine übergebene IP in eine Textdatei speichern und diese später wieder ausgeben. Die "Steuerung" basiert hierbei auf HTTP-GET-Strings.

Das Problem:
Der ganze Krempel funktioniert wunderbar, solange die Verbindung über das Internet aufgebaut wird. Versuche ich das ganze lokal nachzustellen, so hängt mir die Funktion InternetReadFile immer eine 0 ans Ende der eingelesenen Daten. Zur Verdeutlichung: Es ist eine 0 als String und nicht etwa ein #0-Zeichen.

Der Code:
Zunächst einmal die Funktion LoadURL (diese habe ich im Forum gefunden und hatte bisher noch nie Probleme damit):

Delphi-Quellcode:
Uses Windows, WinInet;

function LoadURL(URL: String): String;
var
  IOpen, IURL: HINTERNET;
  Read: Cardinal;
  Msg: array[0..4095] of Char;
begin
  Result := '';
  try
    IOpen := InternetOpen(
               'Mozilla 3.0 (compatible)',
               INTERNET_OPEN_TYPE_PRECONFIG, '', '',
               INTERNET_FLAG_NEED_FILE
             );
    if IOpen <> nil then
    try
      IURL := InternetOpenUrl(IOpen, PAnsiChar(URL), nil, 0,
                INTERNET_FLAG_NO_UI, 0);
      if IURL <> nil then
      try
        repeat
          FillChar(Msg, SizeOf(Msg), 0);
          if InternetReadFile(IURL, @Msg[0], Pred(SizeOf(Msg)), Read) then
            Result := Result + Msg
          else
            Break;
        until Read = 0;
      finally
        InternetCloseHandle(IURL);
      end;
    finally
      InternetCloseHandle(IOpen);
    end;
  except
  end;
end;
Nochmal zur Verdeutlichung: Fehler im PHP-Skript kann man ausschließen. Übers Internet funktioniert alles richtig, und wenn ich das Skript lokal über den Browser öffne, läuft auch alles einwandfrei. Lese ich hingegen mit meinem Delphi-Programm, wird beim lokalen Betrieb die 0 angehängt, im Internet aber nicht.

Meine Frage(n) dazu: Woran liegt es, wie kann ich es umgehen/verhindern, wo ist mein (denk-)Fehler?

Zum besseren Verständnis noch der Projektcode und das PHP-Skript komplett als Anhang.

Hinweise:
  • Das PHP-Skript benötigt Schreibzugriff auf eine ip.txt im gleichen Verzeichnis.
  • Bei der Ausgabe steht jeweils vor der IP oder einer Meldung ein dreistelliger Code, dieser gibt an, ob der Befehl geklappt hat und ist eindeutig beabsichtigt.
  • Die INI-Datei zum Programm ist gerade auf lokalen Betrieb eingestellt. Zum Ausprobieren übers Internet bitte das Semikolon in die richtige Zeile verschieben bzw zum lokal testen die URL anpassen.

Zum Online-Testen liegt dasselbe Skript auch lauffähig unter http://zusitoolset.berlios.de/ip/ip.php (IP Anzeigen | IP 0.0.0.0 setzen | IP aus Datei lesen)

Christian Seehase 23. Feb 2006 21:13

Re: [NonVCL, WinInet/InternetReadFile]: Wo kommt die 0 her?
 
Moin Daniel,

da das Ganze bei Dir ja auf dem IE basiert:
Hast Du schon einmal, vor dem Aufruf, die Temporary Internet Files gelöscht (nur einen definierten Zustand zu schaffen)?

Daniel Schuhmann 23. Feb 2006 21:25

Re: [NonVCL, WinInet/InternetReadFile]: Wo kommt die 0 her?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Servus!

Zumindest auf dem Rechner zu Hause kann ich mit 100% Sicherheit sagen, dass die URL zuvor noch nie aufgerufen habe, da ich diese hier erst eingerichtet und das Programm gleich danach getestet habe. Ich glaube auch nicht, daß es ein Cache-Problem ist: Wenn ich dem Skript eine "neue IP" übergebe, kann ich diese später auch problemlos auslesen, nur die 0 hängt halt dran.

Zur Verdeutlichung hab ich nochmal zwei Screenshots angehängt, einmal remote.gif (über's Internet, funktioniert prächtig), einmal lokal.gif (bekanntes Problem).

Noch eine Erklärung zu lokal.gif:

Ich habe den Button Laden geklickt, das PHP-Skript gibt die localhost-Adresse ::1 zurück (ist IPv6, mit IPv4 wär es 127.0.0.1, es liegt nicht an IPv6, hab ich schon gegengecheckt). Hier schlägt das Problem zum ersten Mal zu: Die 0 wird angehängt, heraus kommt ::10.

Mit Speichern wird das ganze auf den Server geladen, in dem Fall ist beim Senden die 0 mit dran, es wird also als ::10 auf dem Server gespeichert (aber nichts angehängt).

Mit einem Klick auf Anzeigen wird das Skript mit dem Parameter getlastip aufgerufen, gibt ::10 zurück (weil es ja so gespeichert wurde), im Delphi-Programm wird eine weitere 0 angehängt, es erscheint nun ::100 in der Anzeige.

Daniel Schuhmann 24. Feb 2006 10:00

Re: [NonVCL, WinInet/InternetReadFile]: Wo kommt die 0 her?
 
Noch eine kleine Erweiterung: Es scheint irgendwie doch *auch* an der Serversoftware zu liegen. Auf meinem Rechner zu Hause habe ich das Skript laufen, der Fehler tritt auch auf, wenn ich über das Internet drauf zugreife. Am Betrieb lokal/nicht lokal liegt es also nicht.

Mit dieser URL http://smartcoder.dyndns.org/ip/ip.p...am=getonlineip wird die IP völlig korrekt und ohne "Suffix-0" angezeigt, und zwar sowohl im IE, Firefox und Opera.
Wird die URL http://smartcoder.dyndns.org/ip/ip.php in die Ini-Datei meines Programms eingefügt und der Button Laden geklickt (Das Programm generiert dann die URL von oben), so erscheint dieselbe IP mit "Suffix-0".

Irgendwelche Ideen?

Daniel Schuhmann 24. Feb 2006 10:36

Re: [NonVCL, WinInet.InternetReadFile, PHP]: Wo kommt die 0
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal ein wenig geschnüffelt. Mein Rechner zu Hause läuft unter Windows, hat Apache 2.0.54 drauf. Der Berlios-Server (Zusitoolset) hat Apache 1.3.27 drauf und läuft unter Linux.

Edit: Die 0 hängt bei allen Serverantworten mit dran.

Ich hab die beiden Schnüffelomaten-Dateien (Ethereal, müßten TCPdump und diverse andere auch lesen können) mal angehängt.

shmia 24. Feb 2006 15:10

Re: [NonVCL, WinInet.InternetReadFile, PHP]: Wo kommt die 0
 
Die Funktion LoadURL ist nicht so perfekt.
Ich habe sie mal verbessert:
Delphi-Quellcode:
function LoadURL(URL: String): String;
var
  IOpen, IURL: HINTERNET;
  Read: Cardinal;
  Msg: string; // <==
begin
  Result := '';
  try
    IOpen := InternetOpen( 
               'Mozilla 3.0 (compatible)',
               INTERNET_OPEN_TYPE_PRECONFIG, '', '',
               INTERNET_FLAG_NEED_FILE
             );
    if IOpen <> nil then
    try
      IURL := InternetOpenUrl(IOpen, PAnsiChar(URL), nil, 0,
                INTERNET_FLAG_NO_UI, 0);
      if IURL <> nil then
      try
        SetLength(Msg, 4096); // <====
        repeat
           if InternetReadFile(IURL, @Msg[1], 4096, Read) then // <===
            Result := Result + Copy(Msg, 1, Read) // <===
          else
            Break;
        until Read = 0;
      finally
        InternetCloseHandle(IURL);
      end;
    finally
      InternetCloseHandle(IOpen);
    end;
  except
  end;
end;

Daniel Schuhmann 24. Feb 2006 17:33

Re: [NonVCL, WinInet.InternetReadFile, PHP]: Wo kommt die 0
 
Wow das wars, Danke!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.

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