Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi HTTPServer mit IPv6 langsam (https://www.delphipraxis.net/148132-httpserver-mit-ipv6-langsam.html)

paresy 23. Feb 2010 11:45


HTTPServer mit IPv6 langsam
 
Liste der Anhänge anzeigen (Anzahl: 1)
Version:
Delphi 2007 mit Indy SVN (rev. 4065), Vista/Windows7 getestet

Problem:
Sofern IPv6 auf dem System aktiviert ist und der User per Hostnamen (z.B. ipsvm) auf dem Server zugreifen will, gibt es eine Verzögerung um 1 Sekunde pro Request. Direkter Zugriff (z.B. 127.0.0.1) funktioniert problemlos. Nachstellen kann man das am einfachsten mit Chrome, der für alle Anfragen eine Zeitleiste angibt (siehe Screenshot).

Workaround für Firefox ist das deaktiveren von IPv6 DNS Lookups oder deaktivieren von IPv6 auf allen Netzwerkadaptern.

Demo Programm:
Form + HTTPServer (Active = True)

Delphi-Quellcode:
procedure TForm4.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin

 if ARequestInfo.Document = '/' then
  begin
   AResponseInfo.ResponseNo := 200;
   AResponseInfo.ContentText := '<html><head><link rel="stylesheet" type="text/css" href="/a.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/b.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/c.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/d.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/e.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/f.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/g.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/h.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/i.css"/>' +
                                 '<link rel="stylesheet" type="text/css" href="/j.css"/></head><body>asd</body></html>';
  end
 else
  AResponseInfo.ResponseText := 'asd';

end;
Es wäre super, falls jemand einen Tipp hat, was ich machen muss, damit das Problem nicht auftritt!?

Grüße,
paresy

Assertor 23. Feb 2010 14:32

Re: HTTPServer mit IPv6 langsam
 
Hallo paresy,

Du bist ja einer ;) Genau die Problematik hatten wir nämlich letzte Woche auch im Büro! Leider gibt es meines Wissens nichts, was Du auf Anwendungsebene machen kannst: Wie Du am Fix für den Firefox schon siehst, ist das Problem das IPv6 DNS Resolving auf Client bzw. OS Ebene (TCP/IP Stack): Das DNS Resolving wird nicht vom Indy HTTP Server durchgeführt. Wenn Du z.B. Chrome oder den FF nimmst und die feste IP des Servers eingibst, sind die Requests ja schnell.

Abhilfe also nur IPv6 aus, oder z.B. einen Host-Eintrag am Client (im Intranet z.B. per GPO).

Gruß,
Assertor

:dp:

paresy 23. Feb 2010 14:44

Re: HTTPServer mit IPv6 langsam
 
Ich hab das Problem seit ein paar Wochen (und es ist durch irgendeine Revision seitens Indy gekommen - vermutlich verschlimmbessernder IPv6 support) - Im Herbst letzten Jahres lief derselbe Code nämlich 1A.

Aber nachdem ich heute den Post geschrieben habe, hab ich durch Zufall, wie immer, eine Idee gehabt, die das Problem löst. Mal sehen wie gut - Konnte nur kurz testen.

Füge bei Indy bei den Bindings beides hinzu -> IPv4 und IPv6, dann umgehst du das Problem, indem du Indy einfach auf IPv6 reagieren lässt, wenn verfügbar und falls es das nicht gibt, nutzt er einfach IPv4. Funktioniert bis jetzt tadellos.

Hat Indy eine Funktion um einen IPv4 in eine IPv6 Adresse zu konvertieren?

paresy

franktron 23. Feb 2010 15:03

Re: HTTPServer mit IPv6 langsam
 
Das Problem ist der DNS Server die meisten (fast alle) Router können keine IPV6 und können somit keine IPV6 Anfragen verarbeiten,
wenn man jetzt z.b. eine Windows Server hat muss man dort Extra IPV6 aktiveren (für den DNS Server)
Die Hosts Datei zu ändern ist eine nicht sehr schöne Möglichkeit die Schwächen des DNS Server zu umgehen.

Assertor 23. Feb 2010 15:24

Re: HTTPServer mit IPv6 langsam
 
Zitat:

Zitat von paresy
Ich hab das Problem seit ein paar Wochen (und es ist durch irgendeine Revision seitens Indy gekommen - vermutlich verschlimmbessernder IPv6 support) - Im Herbst letzten Jahres lief derselbe Code nämlich 1A.

Wundert mich, denn am IPv6 Support wurde meines Wissens seeeeeehr lange nichts in Indy geändert. Die SVN Kommentare, die zuletzt IPv6 bzw IPv4 enthielten, sind von 2007.

Aber: Du hast recht! Indy bindet per Default an IPv4, konnte IPv6 nicht binden. Es gab einen Fehler in der SupportsIPv6 Funktion.

Test mal bitte folgendes:

In IdStackWindows.pas:

Delphi-Quellcode:
function TIdStackWindows.SupportsIPv6: Boolean;
var
  LLen : LongWord;
  LPInfo, LPCurPtr: LPWSAPROTOCOL_INFO;
  LCount : Integer;
  i : Integer;
begin
  Result := False;
  LLen := 0;
  // Note: WSAEnumProtocols returns -1 when called just to get the needed Buffer Size!
  if (IdWinsock2.WSAEnumProtocols(nil, nil, LLen) = SOCKET_ERROR) and (LLen > 0) then // Änderung
  begin
  ...
@franktron: Du hast auch Recht, gerade die Host-Datei sollte wirklich nur eine sehr seltene Ausnahme darstellen.

Gruß,
Assertor

Edit: Getestet, läuft und ist nun im Indy SVN

paresy 23. Feb 2010 19:43

Re: HTTPServer mit IPv6 langsam
 
Dein Fix sieht gut aus.

paresy

Assertor 24. Feb 2010 10:31

Re: HTTPServer mit IPv6 langsam
 
Zitat:

Zitat von paresy
Dein Fix sieht gut aus.

Freut mich und Danke fürs Reporten!

Gruß,
Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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