A cross-platform FTP/FTPS client library based on Boost.Asio.
FTP (File Transfer Protocol) is a standard network protocol used to transfer files between a client and a server. FTP is built on a client-server model and uses separate connections for transferring commands and files.
- Control connection is a persistent connection used to transfer commands and replies between the client and the server.
- Data connection is a temporary connection used to transfer files. The connection is only open for the duration of the data transfer.
The transfer mode determines how the data connection is established.
- In active mode, the client uses the control connection to send the server the IP address and port number on which the client accepts incoming data connections. The server then uses this information to open a data connection.
- In passive mode, the client uses the control connection to request from the server the IP address and port number on which the server accepts incoming data connections. The client then uses this information to open a data connection. This mode can be used in situations where the client cannot accept incoming connections (firewall, NAT).
The transfer type determines how data is transferred.
- ASCII type can be used to transfer ASCII files between systems with different newline representations. In this
case, the sending side converts the newlines from system style to
CRLF
style, and the receiving side performs the reverse conversion. - Binary type is used to transfer files byte by byte. This transfer type is used by default.
- Windows, Linux and macOS are supported.
- Supports FTP and FTP over TLS/SSL (FTPS).
- Supports IPv4 and IPv6.
- Supports active and passive transfer modes.
- Supports ASCII and binary transfer types.
Download the README.TXT
file from ftp.freebsd.org and output its contents to stdout
:
#include <iostream>
#include <sstream>
#include <ftp/ftp.hpp>
int main(int argc, char *argv[])
{
ftp::client client;
client.connect("ftp.freebsd.org", 21, "anonymous");
std::ostringstream oss;
client.download_file(ftp::ostream_adapter(oss), "pub/FreeBSD/README.TXT");
std::cout << oss.str();
client.disconnect();
return 0;
}
See more examples in the example folder.
This library can be integrated into a project via CMake's FetchContent
, for example:
cmake_minimum_required(VERSION 3.14)
project(application)
include(FetchContent)
FetchContent_Declare(
libftp
GIT_REPOSITORY https://github.com/deniskovalchuk/libftp.git
GIT_TAG v1.4.0)
FetchContent_MakeAvailable(libftp)
add_executable(application main.cpp)
target_link_libraries(application ftp::ftp)
- A C++17-compliant compiler
- CMake 3.14 or newer
- Boost 1.70 or newer
- OpenSSL
- Python3 (only for tests)
Build and run tests:
tool/windows/build.ps1 [-BuildType Debug|Release] [-RunTest]
Clean the builds:
tool/windows/clean.ps1
Build and run tests:
tool/unix/build.sh [--debug | --release] [--test]
Clean the builds:
tool/unix/clean.sh
Build:
$ mkdir -p build
$ cd build
$ cmake ..
$ cmake --build .
To run tests, set the LIBFTP_TEST_SERVER_PATH
environment variable to the path to the
server.py file:
$ export LIBFTP_TEST_SERVER_PATH="/path/to/server.py"
$ cd test
$ ctest -V