Ftp c ++ implementation

Source: Internet
Author: User

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;
}

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.