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 :)