SFTP-Plugin langsamer als FileZilla ?

German support forum

Moderators: white, Hacker, Stefan2

User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48021
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Danke, werde ich gelegentlich anpassen! Der Aufruf von libssh2_sftp_setstat geht aber nur, wenn man SCP nur für die Datenverbindungen benutzt, nicht bei SCP für alles. Da müsste man wohl entsprechende shell-Kommandos absetzen...
Author of Total Commander
https://www.ghisler.com
CoolWater
Power Member
Power Member
Posts: 734
Joined: 2003-03-27, 16:33 UTC

Post by *CoolWater »

2ghisler(Author)

ich glaube, du hast da was falsch verstanden :) Ich habe nur die Zeilen 3-10 ergänzt, der Rest war schon da. In den Zeilen 3-10 passiert genau das mit den shell-Kommandos.

Gruß
CoolWater
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48021
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Ja, aber SftpSetDateTimeW benötigt SFTP, wird aber im Abschnitt SCP only aufgerufen.
Author of Total Commander
https://www.ghisler.com
CoolWater
Power Member
Power Member
Posts: 734
Joined: 2003-03-27, 16:33 UTC

Post by *CoolWater »

2ghisler(Author)

auf den ersten Blick sieht das so aus. Allerdings hattest du in dieser Funktion schon einen entsprechenden SCPOnly-Teil ergänzt:

Code: Select all

	if (ConnectSettings->scponly) {
		SYSTEMTIME tdt={0};
		FILETIME lft;
		char commandbuf[wdirtypemax+32];
		LIBSSH2_CHANNEL *channel;
		channel=ConnectChannel(ConnectSettings->session);
		FileTimeToLocalFileTime(LastWriteTime,&lft);
		FileTimeToSystemTime(&lft,&tdt);
#ifdef sprintf_s
		sprintf_s(commandbuf,sizeof(commandbuf),"touch -t %04d%02d%02d%02d%02d.%02d ",tdt.wYear,tdt.wMonth,tdt.wDay,tdt.wHour,tdt.wMinute,tdt.wSecond);
#else
		sprintf(commandbuf,"touch -t %04d%02d%02d%02d%02d.%02d ",tdt.wYear,tdt.wMonth,tdt.wDay,tdt.wHour,tdt.wMinute,tdt.wSecond);
#endif
		BOOL needquotes=strchr(filename,' ')!=NULL || strchr(filename,'(')!=NULL || strchr(filename,')')!=NULL;
		if (needquotes)
			strlcat(commandbuf,"\"",sizeof(commandbuf)-3);
		strlcat(commandbuf,filename,sizeof(commandbuf)-2);
		if (needquotes)
			strlcat(commandbuf,"\"",sizeof(commandbuf)-1);
		BOOL ok=GetChannelCommandReply(ConnectSettings->session,channel,commandbuf);
		DisconnectShell(channel);
		return ok?SFTP_OK:SFTP_FAILED;
Daher sind es nur die von mir genannten Zeilen 3-10, die ergänzt werden müssen und schon funktioniert das Ganze :D Am besten schaust du dir deinen Quellcode einfach nochmal an.

Gruß
CoolWater
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48021
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Danke, mit "touch -t" sollte es gehen!
Author of Total Commander
https://www.ghisler.com
mifritscher
Junior Member
Junior Member
Posts: 5
Joined: 2015-10-14, 08:26 UTC

Post by *mifritscher »

So, ich habe den Patch von CoolWater mal eingebaut und unter MS VC 2013 (entspricht Version 12.0) gebaut.

Folgende Änderungen:
* defined ssize_t (marked with //mifritscher)
* fixed abs (marked with //mifritscher)
* ftpdir.* wasn't added to build
* added CoolWater fix in SftpUploadFileW():

Code: Select all

  if (retval==SFTP_OK) {
   if (ConnectSettings->scponly) {
            FILETIME ft;
            if (GetFileTime(localfile,NULL,NULL,&ft)) {
                if (SFTP_FAILED == SftpSetDateTimeW(ConnectSettings, RemoteName, &ft)) {
                    // handle error?
                }
            }
   } else {
        LIBSSH2_SFTP_ATTRIBUTES attr;
        // set modification time ONLY if target didn't exist yet!!!
        FILETIME ft;
        memset(&attr,0,sizeof(attr));
        attr.flags=LIBSSH2_SFTP_ATTR_ACMODTIME | (setattr ? LIBSSH2_SFTP_ATTR_PERMISSIONS:0);
        if (GetFileTime(localfile,NULL,NULL,&ft)) {
            __int64 tm2=ft.dwHighDateTime;
            tm2<<=32;
            tm2|=ft.dwLowDateTime;
            __int64 tm=0x019DB1DE;
            tm<<=32;
            tm|=0xD53E8000;
            tm2-=tm;
            attr.mtime=(DWORD)(tm2/(__int64)10000000);
            attr.atime=attr.mtime;
            attr.permissions=ConnectSettings->filemod;
        }
        while (LIBSSH2_ERROR_EAGAIN==libssh2_sftp_setstat(ConnectSettings->sftpsession,
            thename,&attr)) {
            if (EscapePressed()) {
                ConnectSettings->neednewchannel=true;
                break;
            }
            IsSocketReadable(ConnectSettings->sock);  // sleep to avoid 100% CPU!
        }
    }
} 
Ich konnte die 32 und 64 Bit Version bauen, allerdings hängt der komplette Total Commander 9.0a (32 und 64 bit) beim hochladen von Dateien.

Unter https://mifritscher.de/austausch/totalcmd/ könnt ihr es auch mal anschauen. CoolWaters Fix ist NICHT die Ursache für.
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48021
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Bei mir geht es wenn ich nur folgendes einbaue:

Code: Select all

if (retval==SFTP_OK) {
            FILETIME ft;
            if (GetFileTime(localfile,NULL,NULL,&ft)) {
                if (SFTP_FAILED == SftpSetDateTimeW(ConnectSettings, RemoteName, &ft)) {
                    // handle error?
                }
 }
Author of Total Commander
https://www.ghisler.com
CoolWater
Power Member
Power Member
Posts: 734
Joined: 2003-03-27, 16:33 UTC

Post by *CoolWater »

2ghisler(Author)

Allerdings fehlt in der SftpSetDateTimeW()-Funktion das hier:

Code: Select all

attr.flags=LIBSSH2_SFTP_ATTR_ACMODTIME | (setattr ? LIBSSH2_SFTP_ATTR_PERMISSIONS:0);
Das LIBSSH2_SFTP_ATTR_PERMISSIONS Bit wird nicht gesetzt. Sprich man müsste der Funktion noch übergeben, ob die Zieldatei erstellt wurde oder ob eine vorhandene überschrieben wurde (setattr).

HTH
CoolWater
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48021
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Das verstehe ich nicht - wieso sollte das Datum nur gesetzt werden, wenn die Zieldatei nicht existierte? Unter Windows wird das Datum auch beim Überschreiben mit kopiert.
Author of Total Commander
https://www.ghisler.com
CoolWater
Power Member
Power Member
Posts: 734
Joined: 2003-03-27, 16:33 UTC

Post by *CoolWater »

2ghisler(Author)

Es geht nicht speziell um das Datum, sondern um LIBSSH2_SFTP_ATTR_PERMISSIONS. Warum genau das so ist, solltest du am besten wissen als Entwickler ;) Ich nehme die Info auch nur aus deinem Quellcode...
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48021
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Sorry, das sagt mir gar nichts.

Ich habe es jetzt mal ohne diese Option eingebaut:
http://ghisler.ch/board/viewtopic.php?p=325916#325916
Author of Total Commander
https://www.ghisler.com
frier
Junior Member
Junior Member
Posts: 7
Joined: 2017-01-27, 11:21 UTC

Post by *frier »

Ich habe gerade das sftpplug143beta2.zip ausprobiert.

Der Upload ist mit der Option "SCP-alles", egal ob mit oder ohne Komprimierung, flott. D. h. ich erreiche die maximal mögliche Uploadgeschwindigkeit. Beim Download erreiche ich das Maximum nicht ganz (Totalcommander ca. 135 MBit/sek, FileZilla ca. 360 MBit/sek).

Allerdings wird der Datumsstempel nicht beibehalten, sondern auf die aktuelle Zeit gesetzt.

Kann das jemand korrigieren, das ist mein Hauptproblem für die Synchronisierung?

Gruß

Erich
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48021
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Danke für den Test, ich werde das überprüfen.
Author of Total Commander
https://www.ghisler.com
Post Reply