Passively, connect to FTP and upload and download files.
Linux connection. Source Code:
FTP. h
[Cpp]
# Ifndef FTP_H _
# Define FTP_H _
# Include <sys/types. h>
# Include <sys/socket. h>
Class CFTP
{
Public:
CFTP (void );
~ CFTP (void );
// Connect to the ftp server
Int ftp_connect (const char * ip );
// Log on to the ftp server
Int ftp_login (char * user, char * pass );
// Display the current directory
Int ftp_pwd (char * buff );
// Change the Directory
Int ftp_cd (char * dir );
// Return to the upper directory
Int ftp_cdup ();
// Create a directory
Int ftp_mkdir (char * dir );
// Delete the Directory
Int ftp_rmdir (char * dir );
// Data Transmission Mode
Int ftp_setpasv ();
// Upload a file
Int ftp_upload (char * localfile, char * remotepath, char * remotefilename );
// Download an object
Int ftp_download (char * localfile, char * remotefile );
// Log out
Int ftp_quit ();
Private:
Int m_sockctrl; // control the connection to the socket
Int m_sockdata; // data connection socket
Char m_cmd [256]; // storage command
Char m_resp [256]; // stores the Return Statement
Char m_ip [64]; // save ip
Int ftp_sendcmd (); // sends the command
Int ftp_checkresp (char expresp); // receives the returned status and checks whether the status is successful.
Int ftp_mkdirSingle (char * dir );
};
# Endif
FTP. cpp
[Cpp]
# Include <iostream>
# Include <netinet/in. h>
# Include <sys/socket. h>
# Include <netinet/in. h>
# Include <arpa/inet. h>
# Include "FTP. h"
Using namespace std;
CFTP: CFTP (void)
{
}
CFTP ::~ CFTP (void)
{
}
Int CFTP: ftp_checkresp (char expresp)
{
Int len = recv (m_sockctrl, m_resp, 256, 0 );
If (-1 = len) return-1;
M_resp [len] = 0;
Puts (m_resp); // The ftp running log should be saved
If (m_resp [0]! = Expresp) return-1;
Return 0;
}
Int CFTP: ftp_sendcmd ()
{
Int ret = send (m_sockctrl, m_cmd, strlen (m_cmd), 0 );
If (-1 = ret) return-1;
Return 0;
}
Int CFTP: ftp_connect (const char * ip)
{
M_sockctrl = socket (AF_INET, SOCK_STREAM, 0 );
If (0 = m_sockctrl) return-1;
Struct sockaddr_in addr;
Addr. sin_family = AF_INET;
Addr. sin_port = htons (21 );
Addr. sin_addr.s_addr = inet_addr (ip );
Int err = connect (m_sockctrl, (sockaddr *) & addr, sizeof (addr ));
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_login (char * user, char * pass)
{
Sprintf (m_cmd, "USER % s \ r \ n", user );
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('3 ');
If (err) return-1;
Sprintf (m_cmd, "PASS % s \ r \ n", pass );
Err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_quit ()
{
Sprintf (m_cmd, "QUIT \ r \ n ");
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_cd (char * dir)
{
Sprintf (m_cmd, "CWD % s \ r \ n", dir );
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_cdup ()
{
Sprintf (m_cmd, "CDUP \ r \ n ");
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_pwd (char * buff)
{
Sprintf (m_cmd, "PWD \ r \ n ");
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Char * p = m_resp;
While (* p)
{
If (* p ++ = '"')
While (* p! = '"')
* Buff ++ = * p ++;
}
* Buff = 0;
Printf ("current work directory is: % s \ n", buff );
Return 0;
}
Int CFTP: ftp_mkdirSingle (char * dir)
{
Sprintf (m_cmd, "MKD % s \ r \ n", dir );
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_mkdir (char * dir)
{
Char path [300];
Int err = ftp_cd ("/");
If (err) return-1;
Int I, j;
// Printf ("strlen (dir): % d", strlen (dir ));
For (I = 1, j = 0; I <strlen (dir); I ++) // The first byte is the root directory.
{
Path [j ++] = dir [I];
If (dir [I] = '/'){
Path [j ++] = '\ 0 ';
Printf ("create: % s \ n", path );
Err = ftp_mkdirSingle (path );
Err = ftp_cd (path );
If (err) return-1;
J = 0;
}
}
Path [j ++] = '\ 0 ';
Sprintf (m_cmd, "MKD % s \ r \ n", path );
Err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_rmdir (char * dir)
{
Sprintf (m_cmd, "RMD % s \ r \ n", dir );
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_upload (char * localfile, char * remotepath, char * remotefilename)
{
Ftp_mkdir (remotepath );
Int err = ftp_cd (remotepath );
If (err) return-1;
Ftp_setpasv ();
Sprintf (m_cmd, "STOR % s \ r \ n", remotefilename );
Err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('1 ');
If (err) return-1;
FILE * pf = fopen (localfile, "r ");
If (NULL = pf) return-1;
Char sendbuf [256];
Size_t len = 0;
While (len = fread (sendbuf, 1,255, pf)> 0)
{
Err = send (m_sockdata, sendbuf, len, 0 );
If (err <0) return-1;
}
Close (m_sockdata );
Fclose (pf );
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Int CFTP: ftp_setpasv ()
{
Sprintf (m_cmd, "PASV \ r \ n ");
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1;
M_sockdata = socket (AF_INET, SOCK_STREAM, 0 );
Unsigned int v [6];
Union {
Struct sockaddr sa;
Struct sockaddr_in;
} Sin;
Sscanf (m_resp, "% * [^ (] (% u, % u", & v [2], & v [3], & v [4], & v [5], & v [0], & v [1]);
Sin. sa. sa_family = AF_INET;
Sin. sa. sa_data [2] = v [2];
Sin. sa. sa_data [3] = v [3];
Sin. sa. sa_data [4] = v [4];
Sin. sa. sa_data [5] = v [5];
Sin. sa. sa_data [0] = v [0];
Sin. sa. sa_data [1] = v [1];
Int on = 1;
If (setsockopt (m_sockdata, SOL_SOCKET, SO_REUSEADDR,
(Const char *) & on, sizeof (on) =-1)
{
Perror ("setsockopt ");
Close (m_sockdata );
Return-1;
}
Struct linger lng = {0, 0 };
If (setsockopt (m_sockdata, SOL_SOCKET, SO_LINGER,
(Const char *) & lng, sizeof (lng) =-1)
{
Perror ("setsockopt ");
Close (m_sockdata );
Return-1;
}
Err = connect (m_sockdata, (sockaddr *) & sin, sizeof (sin ));
If (err) return-1;
Return 0;
}
Int CFTP: ftp_download (char * localfile, char * remotefile)
{
/* Sprintf (m_cmd, "type a \ r \ n", remotefile );
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('2 ');
If (err) return-1 ;*/
Ftp_setpasv ();
Sprintf (m_cmd, "RETR % s \ r \ n", remotefile );
Int err = ftp_sendcmd ();
If (err) return-1;
Err = ftp_checkresp ('1 ');
If (err) return-1;
FILE * pf = fopen (localfile, "w ");
If (NULL = pf) return-1;
Char recvbuf [256];
Int len = 0;
While (len = recv (m_sockdata, recvbuf, 256, 0)> 0)
{
Err = fwrite (recvbuf, len, 1, pf );
If (len <0) return-1;
}
Close (m_sockdata );
Fclose (pf );
Err = ftp_checkresp ('2 ');
If (err) return-1;
Return 0;
}
Test code. main. cpp:
[Cpp]
# Include "FTP. h"
# Include <iostream>
Using namespace std;
Int main (int argc, char * argv [])
{
// Log on
CFTP ftpclient;
Int err;
Err = ftpclient. ftp_connect ("192.168.1.63 ");
If (err ){
Puts ("connect ftp server failed ");
Exit (-1 );
}
Puts ("connect OK ");
Err = ftpclient. ftp_login ("root", "root123 ");
If (err ){
Puts ("login failed ");
Exit (-1 );
}
Puts ("login OK ");
Err = ftpclient. ftp_download ("/liuzhe/TestFtp/down.txt", "11.txt ");
If (err ){
Puts ("download failed ");
Exit (-1 );
}
Puts ("download OK ");
Err = ftpclient. ftp_upload ("/liuzhe/TestFtp/up.txt", "/2012-11-29/aa/bb/cc", "22.txt ");
If (err ){
Puts ("upload failed ");
Exit (-1 );
} Www.2cto.com
Puts ("upload OK ");
Err = ftpclient. ftp_quit ();
If (err ){
Puts ("quit failed ");
Exit (-1 );
}
Puts ("you quit ");
Return 0;
}