FTP Klient - Upload souborů na server – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

FTP Klient - Upload souborů na server – C / C++ – Fórum – Programujte.comFTP Klient - Upload souborů na server – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Cruppy0
Newbie
24. 11. 2014   #1
-
0
-

Dobrý den,
chtěl bych poprosit o malou radu. Pro vlastní účely si vytvářím FTP klienta, nechci používat již
napsané knihovny, a tak jsem se rozhodl že si ho vytvořím sám. Mám však malý problém.
Při odesílání dat na server vše proběhne v pořádku, soubor se na serveru vytvoří i naplní daty,
ale server jakoby ignoroval znaky '\r\n' a '\n' ( například pošlu soubor s nějakým textem, kde je několik
odstavců, ale ty se na serveru spojí do jednoho řádku ) ... Už jsem zkusil snad vše a nenapadá mě, kde
by mohl být problém. Už jsem zkoušel přeposlat soubor ze svého klienta na svůj provizorní server
vytvořený v konzoli ( jen funkce recv() ) a tam se příjme vše normálně i se znaky '\r\n', takže nevím jaký mají FTP servery s mými daty problém :D

( Vše dělám v C/C++ a Winsock 2. )

Zde je funkce pro odesílání souboru z klienta: 

int PutFile( char *filename )
    {
        fstream stream;
        stream.open( filename, ios::in | ios::binary );
        if( !stream.is_open() )
        {
            Print( "FTP_COMMAND[info]( %d ): Could not open file!", __LINE__ );
            return -1;
        }
        int sizeoffile = 0;
        int filepos = 0;
        stream.seekg( 0, ios::end );
        sizeoffile = stream.tellg();
        stream.seekg( 0, ios::beg );

        if( sizeoffile <= 0 )
        {
            Print( "FTP_COMMAND[in]( %d ): Invalid file!", __LINE__ );
            return - 1;
        }

        char *file = new char[sizeoffile + 1];
        memset( file, 0, sizeoffile + 1);
        stream.read( file, sizeoffile );

        char _filename[512];
        memset( _filename, 0, 512 );

        char *ptr = 0;
        if( ( ptr = strrchr( filename, '/' ) ) > 0 || ( ptr = strrchr( filename, '\' ) ) > 0 )
        {
            memcpy( _filename, ( ptr + 1 ), strlen( ( ptr + 1 ) ) );
        }
        else
        {
            memcpy( _filename, filename, strlen( filename ) );
        }

        Pasv( );
        TransferType( ASCII );

        SendCommand( "STOR", _filename );
        memset( ftpcommand_b, 0, 1500);
        if( recv( ftpcommand, ftpcommand_b, 1500, 0 ) == SOCKET_ERROR )
        {
            closesocket( ftpcommand );
            return - 1;
        }
        Print( "FTP_COMMAND[in]( %d ): %s", __LINE__, ftpcommand_b );

        int maxtime = 3000;
        setsockopt( ftpdata, SOL_SOCKET, SO_RCVTIMEO, ( char* ) maxtime, sizeof( int ) );

        while( filepos != sizeoffile )
        {
            int ssize = sizeoffile - filepos < 1500 ? sizeoffile - filepos : 1500;
            Print( "FTP_DATA[in]( %d ): Data size: %d", __LINE__, ssize );

            if( send( ftpdata, &file[filepos], ssize, 0 ) == SOCKET_ERROR )
            {
                Print( "FTP_DATA[in]( %d ): Failed to send data!", __LINE__ );
                closesocket( ftpdata );
                return - 1;
            }
            filepos += ssize;
        }

        closesocket( ftpdata );

        memset( ftpcommand_b, 0, 1500);
        if( recv( ftpcommand, ftpcommand_b, 1500, 0 ) == SOCKET_ERROR )
        {
            closesocket( ftpcommand );
            return - 1;
        }
        Print( "FTP_COMMAND[in]( %d ): %s ssize: %d", __LINE__, ftpcommand_b, filepos );
        stream.close( );
    return 0;
    }

Funkce na příjem dat funguje, tato pravděpodobně ne tak úplně...
Chápu, že kód nejspíše nevypadá nejlépe a budou se tam nacházet malé, možná i velké "prasečinky", ale snažím se pouze pochopit, jak FTP funguje..
samozřejmě se chystám kód upravit. 
Děkuji za jakoukoli pomoc :)

Nahlásit jako SPAM
IP: 88.103.3.–
Řešení
Ovrscout
~ Anonymní uživatel
113 příspěvků
25. 11. 2014   #2
-
0
-
Vyřešeno Nejlepší odpověď

jen tipuju, ale možná je potřeba nastavit typ přenosu na binární. FTP povel "binary" nebo tak nejak. Jinak může dojít ke konverzi. také je dobré kouknout na ten soubor např v hexa editoru, je divné že by tam nebyli žádné konce řádek. Spíš budou nahrazeny znakem /n nebo /r který může být v některém prohlížeči souborů ignorován pokud není v páru /n/r případně /r/n. Také je možno monitorovat přímo TCP komunikaci pomocí wiresharku.

Nahlásit jako SPAM
IP: 193.165.79.–
Cruppy0
Newbie
25. 11. 2014   #3
-
0
-

Dobrý den. Děkuji za odpověď. Problém souvisel právě s přenosovým režimem. Chyba byla na místě, kde jsem to nečekal a to ve funkci na příjem dat. Tam jsem právě měl pouze režim binary, který jsem změnil na ASCII a vše je v pořádku. Omlouvám se za zbytečné zdržování :)

Nahlásit jako SPAM
IP: 188.175.191.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý