Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdFTP List Befehl unter Vista? (https://www.delphipraxis.net/97415-tidftp-list-befehl-unter-vista.html)

Angel4585 10. Aug 2007 08:07


TIdFTP List Befehl unter Vista?
 
Hallo,

ich habe das Problem, dass meine TIdFTP Komponente unter Vista ewig auf ein Ergebnis bei der Funktion "List" wartet.
Ich konnte die Zeile lokalisieren wo er ewig wartet.
In der Unit idTCPClient der Indys:
Delphi-Quellcode:
procedure TIdTCPClientCustom.Connect;
begin
  // Do not call Connected here, it will call CheckDisconnect
  EIdAlreadyConnected.IfTrue(Connected, RSAlreadyConnected);
  if IOHandler = nil then begin
    IOHandler := MakeImplicitClientHandler;
    IOHandler.OnStatus := OnStatus;
    ManagedIOHandler := True;
  end;
  try
    // Bypass GetDestination
    if FDestination <> '' then begin
      IOHandler.Destination := FDestination;
    end;

{BGO: not any more, TIdTCPClientCustom has precedence now (for port protocols, and things like that)
    // We retain the settings that are in here (filled in by the user)
    // we only do this when the iohandler has no settings,
    // because the iohandler has precedence
    if (IOHandler.Port = 0) and (IOHandler.Host = '') then begin
      IOHandler.Port := FPort;
      IOHandler.Host := FHost;
    end;
}

    IOHandler.Port := FPort; //BGO: just to make sure
    IOHandler.Host := FHost;
    if IOHandler is TIdIOHandlerSocket then begin
      TIdIOHandlerSocket(IOHandler).IPVersion := FIPVersion;
    end;

    if FConnectTimeout > 0 then begin
      IOHandler.ConnectTimeout := FConnectTimeout;
    end;
    if FReadTimeout > 0 then begin
      IOHandler.ReadTimeout := FReadTimeout;
    end;

    IOHandler.Open;//<---------- Hier hängt er!!
    if IOHandler.Intercept <> nil then begin
      IOHandler.Intercept.Connect(Self);
    end;

    DoStatus(hsConnected, [Host]);
    DoOnConnected;
  except
    IOHandler.Close;
    raise;
  end;
end;
Was ich interessant finde: Ein paar Zeilen obendran wird eine IP-Adresse und ein Port zugewiesen.
Beide habe ich nirgenwo eingetragen, die IP-Adresse ist aus dem lokalen Netzwerk(192.168.115.20) und der Port ist immer unterschiedlich.

Bernhard Geyer 10. Aug 2007 08:08

Re: TIdFTP List Befehl unter Vista?
 
Schon mal die Vista-Firewall testweise ausgeschaltet?

Angel4585 10. Aug 2007 08:19

Re: TIdFTP List Befehl unter Vista?
 
Ja testweise bei der Installation.. die ist aus :roll:
ich bin mal noch weiter in den Code rein.
In der idStackWindows:
Delphi-Quellcode:

procedure TIdStackWindows.Connect(const ASocket: TIdStackSocketHandle;
 const AIP: string; const APort: TIdPort;
 const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION);
var
  LAddr: TSockAddrIn;
  Addr6: TSockAddrIn6;
begin
  case AIPVersion of
    Id_IPv4: begin
      LAddr.sin_family := Id_PF_INET4;
      TranslateStringToTInAddr(AIP, LAddr.sin_addr, Id_IPv4);
      LAddr.sin_port := HToNS(APort);
      CheckForSocketError(IdWinsock2.Connect(ASocket, @LAddr, SizeOf(LAddr)));
    end;
    Id_IPv6: begin
      Addr6.sin6_flowinfo:=0;
      Addr6.sin6_scope_id:=0;
      Addr6.sin6_family := Id_PF_INET6;
      TranslateStringToTInAddr(AIP, Addr6.sin6_addr, Id_IPv6);
      Addr6.sin6_port := HToNs(APort);
      CheckForSocketError(IdWinsock2.Connect(ASocket, psockaddr(@Addr6), SizeOf(Addr6)));//Wenn ich hier einen Haltepunkt mache und dann F7 drücke hängts.. also vmtl die Zeile in der was bzw. nix passiert
    end;
    else begin
      IPVersionUnsupported;
    end;
  end;
end;
Seltsam ist ja, dass er beim erstenmal durchläuft mit der Adresse und dem Port vom Proxy und beim zweitenmal wo er das durchläuft hat er ne falsche IP und falschen Port.

Edit: Der erste Durchlauf ist der TIdFTP.Connect, der Zweite TIdFTP.List
Edit2:
Ich hab mal geschaut wo er diese seltsame IP herbekommt.
In der IdFTP:
Delphi-Quellcode:
procedure TIdFTP.SendInternalPassive(const ACmd: String; var VIP: string;
  var VPort: integer);
var
  i,bLeft,bRight: integer;
  s: string;
begin
  SendDataSettings;
  SendCmd(ACmd, 227);     {do not localize}
  s := Trim(LastCmdResult.Text[0]);//Hier wird die eingelesen und später zugewiesen

Angel4585 10. Aug 2007 09:05

Re: TIdFTP List Befehl unter Vista?
 
OK, also das Problem habe ich gefunden:

Wenn ich versuche von meinem Rechner hier aus eine passive Verbindung zu meinem FTP-Ordner aufzubauen, dann bekomm ich ewig keine Antwort.

Bei FileZilla funktioniert es passiv auch nicht, allerdings macht es dann auf aktiv und dann geht es.
Was muss ich jetzt alles machen damit mein eigener Client auch aktiv kann?
Nur das Flag setzen wird wohl nicht genügen oder?


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