![]() |
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:
Es wäre super, falls jemand einen Tipp hat, was ich machen muss, damit das Problem nicht auftritt!?
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; Grüße, paresy |
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: |
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 |
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. |
Re: HTTPServer mit IPv6 langsam
Zitat:
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:
@franktron: Du hast auch Recht, gerade die Host-Datei sollte wirklich nur eine sehr seltene Ausnahme darstellen.
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 ... Gruß, Assertor Edit: Getestet, läuft und ist nun im Indy SVN |
Re: HTTPServer mit IPv6 langsam
Dein Fix sieht gut aus.
paresy |
Re: HTTPServer mit IPv6 langsam
Zitat:
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