Poco для C++: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Poco и зачем он нужен?

POCO (POrtable COmponents) — это мощная кроссплатформенная библиотека классов для C++, которая предоставляет готовые решения для разработки сетевых приложений, многопоточности, работы с базами данных, XML, JSON, HTTP, FTP, SMTP и многих других задач. Библиотека написана на современном C++ и распространяется под лицензией Boost Software License, что позволяет использовать её в коммерческих проектах без ограничений.

Основные преимущества Poco:

  • Кроссплатформенность — работает на Windows, Linux, macOS, iOS, Android
  • Модульность — можно подключать только нужные компоненты
  • Производительность — оптимизирована для высоконагруженных систем
  • Полнота — покрывает 90% типовых задач разработчика C++

Для образовательного сайта pythonlib.ru важно отметить, что Poco — это аналог популярных Python-библиотек (requests, asyncio, smtplib), но для C++. Если вы знаете Python и переходите на C++, Poco станет вашим лучшим другом.

Установка Poco

Установка через пакетные менеджеры

Linux (Ubuntu/Debian):

sudo apt-get update
sudo apt-get install libpoco-dev

macOS (Homebrew):

brew install poco

Windows (vcpkg):

vcpkg install poco

Установка из исходников

git clone https://github.com/pocoproject/poco.git
cd poco
mkdir cmake-build
cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --install .

Подключение в CMake проекте

find_package(Poco REQUIRED COMPONENTS Net NetSSL Util JSON XML)
target_link_libraries(myapp Poco::Net Poco::Util Poco::JSON Poco::XML)

Быстрый старт: HTTP-клиент за 5 минут

Напишем простой HTTP-клиент, который получает данные с сайта и выводит их в консоль:

#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/StreamCopier.h>
#include <iostream>

int main() {
    try {
        // Создаем HTTP-сессию
        Poco::Net::HTTPClientSession session("api.github.com");
        
        // Формируем GET-запрос
        Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/users/octocat");
        request.setContentType("application/json");
        
        // Отправляем запрос
        session.sendRequest(request);
        
        // Получаем ответ
        Poco::Net::HTTPResponse response;
        std::istream &responseStream = session.receiveResponse(response);
        
        // Выводим статус и тело ответа
        std::cout << "Status: " << response.getStatus() << " " << response.getReason() << std::endl;
        std::cout << "Body:" << std::endl;
        Poco::StreamCopier::copyStream(responseStream, std::cout);
        
    } catch (Poco::Exception &ex) {
        std::cerr << "Error: " << ex.displayText() << std::endl;
        return 1;
    }
    return 0;
}

Компиляция:

g++ -o http_client http_client.cpp -lPocoNet -lPocoFoundation

Основные методы и функции Poco (сетевые утилиты)

1. HTTPClientSession — создание HTTP-сессии

Что делает: Устанавливает соединение с HTTP-сервером и управляет отправкой запросов и получением ответов.

Параметры:

  • host — строка с адресом сервера
  • port — порт (по умолчанию 80 для HTTP)
  • timeout — таймаут соединения

Пример:

Poco::Net::HTTPClientSession session("example.com", 8080);
session.setTimeout(Poco::Timespan(10, 0)); // 10 секунд
session.setKeepAlive(true);

2. HTTPRequest — формирование HTTP-запроса

Что делает: Создает HTTP-запрос с указанием метода, URI, заголовков и тела.

Параметры:

  • method — HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_DELETE
  • uri — путь запроса
  • version — версия HTTP (по умолчанию HTTP/1.1)

Пример:

Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/api/data");
request.setContentType("application/json");
request.set("Authorization", "Bearer token123");
std::string body = R"({"key": "value"})";
request.setContentLength(body.length());

3. HTTPResponse — работа с ответом сервера

Что делает: Предоставляет доступ к статусу, заголовкам и телу HTTP-ответа.

Параметры: Нет (создается пустым, заполняется после receiveResponse)

Пример:

Poco::Net::HTTPResponse response;
std::istream &bodyStream = session.receiveResponse(response);
int status = response.getStatus(); // 200, 404, 500
std::string contentType = response.getContentType();
Poco::Net::NameValueCollection headers = response.getCookies();

4. HTTPSClientSession — защищенное соединение (SSL/TLS)

Что делает: Аналог HTTPClientSession, но с поддержкой шифрования.

Параметры:

  • host — адрес сервера
  • port — порт (по умолчанию 443)
  • context — SSL-контекст (опционально)

Пример:

Poco::Net::Context::Ptr context = new Poco::Net::Context(
    Poco::Net::Context::CLIENT_USE, "", "", "", 
    Poco::Net::Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
Poco::Net::HTTPSClientSession session("api.github.com", 443, context);

5. ServerSocket — создание TCP-сервера

Что делает: Создает серверный сокет для приема входящих соединений.

Параметры:

  • port — порт для прослушивания
  • backlog — размер очереди ожидания (по умолчанию 64)

Пример:

Poco::Net::ServerSocket serverSocket(8080);
Poco::Net::SocketAddress clientAddress;
Poco::Net::StreamSocket clientSocket = serverSocket.accept(clientAddress);
std::cout << "Client connected: " << clientAddress.toString() << std::endl;

6. SocketAddress — работа с сетевыми адресами

Что делает: Представляет IP-адрес и порт, поддерживает IPv4 и IPv6.

Параметры:

  • host — IP-адрес или доменное имя
  • port — номер порта

Пример:

Poco::Net::SocketAddress addr1("192.168.1.1", 8080);
Poco::Net::SocketAddress addr2("::1", 80); // IPv6 localhost
Poco::Net::SocketAddress addr3("example.com", 443);
std::cout << "IP: " << addr1.host().toString() << " Port: " << addr1.port() << std::endl;

7. DatagramSocket — работа с UDP

Что делает: Отправляет и принимает UDP-датаграммы.

Параметры:

  • address — локальный адрес для привязки

Пример:

Poco::Net::DatagramSocket udpSocket;
Poco::Net::SocketAddress broadcast("255.255.255.255", 12345);
std::string message = "Hello UDP!";
udpSocket.sendTo(message.data(), message.size(), broadcast);

char buffer[1024];
Poco::Net::SocketAddress sender;
int n = udpSocket.receiveFrom(buffer, sizeof(buffer), sender);
std::cout << "Received: " << std::string(buffer, n) << std::endl;

8. WebSocket — работа с WebSocket-соединениями

Что делает: Устанавливает и поддерживает WebSocket-соединение для двусторонней связи.

Параметры:

  • request — HTTP-запрос с заголовками WebSocket
  • response — HTTP-ответ

Пример:

Poco::Net::HTTPClientSession session("echo.websocket.org");
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/");
Poco::Net::HTTPResponse response;
Poco::Net::WebSocket ws(session, request, response);

ws.sendFrame("Hello WebSocket!", Poco::Net::WebSocket::FRAME_TEXT);
char buffer[1024];
int flags;
int n = ws.receiveFrame(buffer, sizeof(buffer), flags);
std::cout << "Received: " << std::string(buffer, n) << std::endl;

9. FTPClientSession — работа с FTP

Что делает: Подключается к FTP-серверу и выполняет файловые операции.

Параметры:

  • host — адрес FTP-сервера
  • port — порт (по умолчанию 21)
  • username — имя пользователя
  • password — пароль

Пример:

Poco::Net::FTPClientSession ftp("ftp.example.com");
ftp.login("user", "pass");
ftp.setWorkingDirectory("/uploads");
std::ostream &uploadStream = ftp.beginUpload("file.txt");
uploadStream << "File content";
ftp.endUpload();
ftp.download("file.txt", "local_copy.txt");
ftp.logout();

10. SMTPClientSession — отправка email

Что делает: Отправляет электронные письма через SMTP-сервер.

Параметры:

  • host — SMTP-сервер
  • port — порт (25, 465 для SSL, 587 для TLS)

Пример:

Poco::Net::SMTPClientSession smtp("smtp.gmail.com", 587);
smtp.login(Poco::Net::SMTPClientSession::AUTH_LOGIN, "user@gmail.com", "password");
Poco::Net::MailMessage message;
message.setSender("user@gmail.com");
message.addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "recipient@example.com"));
message.setSubject("Test from Poco");
message.setContent("Hello, this is a test email.");
smtp.sendMessage(message);
smtp.close();

Реальный практический пример: REST API клиент для погоды

Создадим полноценный клиент для получения данных о погоде с OpenWeatherMap

Рекомендаций