Последние записи
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
1st
Июл
Работаем в сетью с помощью libcurl
Posted by Chas under Статьи, Топик-обзор
В этой статье я бы хотел осветить вопросы взаимодействия с Web и Ftp серверами в C++ программе. Никто не запрещает программировать сокеты и самостоятельно реализовывать протоколы. Но зачем изобретать велосипед, когда существует готовое, отлаженное и мощное решение, способное удовлетворить практически любые Ваши потребности? Речь идет о библиотеке libcurl. Это простая в использовании, кроссплатформенная (поддерживаются Linux, Windows, Solaris, Qnx, FreeBSD, OpenBsd, MacOS X и многие другие) клиентская библиотека, позволяющая работать с протоколами FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. Поддерживаются SSL сертефикаты, HTTP POST, HTTP PUT, FTP закачка, HTTP закачка, прокси-сервера, куки, аутентификация, восстановление закачки файла, тунелирование http proxy и многое другое. Libcurl имеет завязки на множество языков программирования, среди которых: C, C++, Java, Lisp, PHP, Ruby, Perl, Pascal, Haskell.
автор: oleg kutkov
И самое главное — библиотека полностью свободна, как для некоммерческого, так и для коммерческого применения. Разумеется, перед тем, как начать использование библиотеку — ее нужно получить, установить и дать возможность, своему компилятору, использовать ее. Рассмотрим выполнение этих действий, как обычно на примере двух платформ: Linux и Windows.
Установка в Linux
В случае Linux — все довольно просто, Вам необходимо скачать http://curl.haxx.se/download/curl-7.16.2.zip. В этом архиве содержиться полный исходный код библиотеки, скрипты сборки, а так же полная документация API и примеры (поэтому пользователям Windows так же не помешает скачать себе этот архив). После распаковки — необходимо выполнить стандартную процедуру компиляции и установки, с помощью configure и make && make install. Это все, можно пользоваться возможностями библиотеки. Для компиляции программы, следуюет добавлять к опциям компилятора
pkg-config --libs libcurl
pkg-config --cflags libcurl
либо
curl-config --libs libcurl
curl-config --cflags libcurl
Установка в Windows
В случае Windows — немного сложнее.
Вам необходимо скачать http://my.guardpuppy.com/libcurl-7.1…zlib-1.2.3.zip. Распаковать следующие файлы в указанные места:
libeay32.dll — распаковать в %SystemDrive%\%SystemRoot%\System32
ssleay32.dll — распаковать в %SystemDrive%\%SystemRoot%\System32
zlib1.dll — распаковать в %SystemDrive%\%SystemRoot%\System32
Если Вы используете Visual Studio 98, то libcurl_imp.lib распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio\VC98\Lib
Если Вы используете VisualStudio 2005 и новее, то libcurl_imp.lib распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\VC\lib
Распаковать содержимое каталога include полность:
Если Вы используете Visual Studio 98, то распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio\VC98\Include
Если Вы используете VisualStudio 2005 и новее, то libcurl_imp.lib распаковать в %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\VC\Include
Следует обратить внимание, что перед компиляцией проекта, во всех версиях Visual Studio, необходимо зайти в параметры проекта, перейти в раздел опций линковщика (linking), выбрать из выпадающего списка группу input и в появившийся список подключаемых, при компиляции, библиотек добавить, в самом конце, libcurl_imp.lib
Так же в архиве содержится консольная утилита curl.exe, позволяющая использовать все возможности библиотеки, в командном режиме.
Написание кода
Теперь все готово и можно приступать к рассмотрению библиотеки и написанию кода.
Для использования библиотеки необходимо подключить заголовочный файл curl.h
#include <curl/curl.h>
Доступ к функциям библиотеки осущствляеются после открытия новой easy сессии и получения управляющего интерфейса типа CURL. Без открытия сессии — вызывать какие либо фукнции запрещено. Для выполнения всех этих действий служит функция curl_easy_init(), она выполняет инициализацию библиотеки, открытие сессии и возвращает объект типа CURL или же NULL, в случае, когда что-то пошло не так.
CURL *curl; //объект типа CURL
curl = curl_easy_init(); //инициализация
if(curl) //обязательная проверка
{
//выполнение всех дальнейших действий с библиотекой
}
Далее необходимо задать опции сессии, такие как URL, с которым мы собираемся работать, прокси сервер (если он есть), функции обратного вызова (о них ниже) и т.п.
Задание опций осуществляется с помощью функции curl_easy_setopt. Рассмотрим ее объявление и параметры:
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
CURL *handle — указатель на интерфейс, который мы получили выше.
CURLoption option — название опции, которую следует задать.
parameter — параметр, который связывается с опцией, это может быть число, указатель на функцию, строка. Функцию можно вызывать несколько раз подряд, задавая необходимые опции. Все опции, по умолчанию, выключены.
Рассмотрим наиболее интересные и используемые опции, а так же их параметры.
CURLOPT_HEADER — применяется при работе с HTTP, ненулевое значение параметра заставляет библиотеку отображать заголовок в теле запрошенной страницы.
CURLOPT_WRITEFUNCTION — данная опция позволяет задавать, в качестве параметра, указатель на функцию обратного вызова. Эта функция вызывается библиотекой, каждый раз, когда принимаются какие либо данные, требующие дальнейшего использования или сохранения. Описание функции будеит преведено ниже.
CURLOPT_WRITEDATA — эта опция определяет параметр, как объект, в который производится запись принимаемых данных.
CURLOPT_READFUNCTION — опция полностью аналогичная CURLOPT_WRITEFUNCTION, но используетс для передачи данных удаленному узлу.
CURLOPT_READDATA — аналогично CURLOPT_WRITEDATA, но так же для передачи.
CURLOPT_ERRORBUFFER — опция определяет строковый параметр, в который будут записываться сообщения об ошибках в читабельном, для людей, виде.
CURLOPT_URL — очень важная опция, в параметре указывается строка — URL, с которым собираемся взаимодействовать. В строке параметра можно указать небходимый протокол, в виде стандартного префикса «http://» или «ftp://».
CURLOPT_PROXY — опция, определяет строковый параметр — адрес и порт прокси-сервера. Параметр имеет стандартный вид: айпи-адрес (или имя, если есть возможность это имя разрешить) сервера и через двоеточние порт. Например: «proxy:8080»
CURLOPT_PROXYTYPE — параметр этой опции задает тип прокси. Возможные значения параметра: CURLPROXY_HTTP, CURLPROXY_SOCKS4, CURLPROXY_SOCKS5
CURLOPT_HTTPPROXYTUNNEL — ненулевое значение параметра этой опции включает туннелирование вышеуказанного прокси.
CURLOPT_INTERFACE — строковый параметр этой опции задает внешний интерфейс, это может быть как айпи-адрес, так и имя. Разумеется, если сетевой интерфейс — единственный, эту опцию
CURLOPT_PORT — эта опция позволяет задать номер порта удаленного узла. Если эта опция не задается, для соеинения используется порт по умолчанию, для протокола (http — 80, ftp — 21 и т.д.).
CURLOPT_PROXYUSERPWD — эта опция используется для аутентификации на прокси-сервере. Параметр передается в виде строки «логин:пароль».
CURLOPT_USERPWD — опция используется для HTTP аутентификации. Параметр аналогичен предидущему.
CURLOPT_HTTPAUTH — параметр этой опции определяет тип HTTP аутентификации, возможные значения:
CURLAUTH_BASIC — базовый вид аутентификации, используемый, как правило, по умолчанию. Имя пользователя и пароль передаются открытым текстом.
CURLAUTH_DIGEST — является более безопасной версией предидущей.
CURLAUTH_GSSNEGOTIATE — метод аутентификации Microsoft, используемый на серверах этой компании. Поддерживает аутнетификацию Kerberos5. Для использования этого вида аутентификации необходима библиотека GSS.
CURLAUTH_NTLM — метод, так же разработанный и используемый Microsoft, для защиты использует хеширование. Требует наличия OpenSSL.
CURLAUTH_ANY — этот параметр заставляет libcurl выбрать все типы аутентификации, срабатывает метод наиболее подходящий к данному случаю.
CURLAUTH_ANYSAFE — то же самое, только не выбирается CURLAUTH_BASIC аутентификация.
Я показал лишь наиболее общие опции, их список, на самом деле, очень велик, подробнее с ними можно ознакомится в HTML документации к библиотеке. Перед рассмотрением нашего первого примера стоит упомянуть еще две библиотечные функции, а так же функции обратного вызова, о которых я говорил выше.
void curl_easy_reset(CURL *handle) — выполняет повторную инициализацию библиотеки с установкой всеъ опций в значения по умолчанию.
void curl_easy_cleanup(CURL * handle) — Это функция должна вызываться самой последней и вызываться должна обязательно. Она выполняет завершение текущей сессии.
size_t function( void *ptr, size_t size, size_t nmemb, void *stream) — объявление функции, параметра опции CURLOPT_WRITEFUNCTION. Её аргументы:
ptr — указатель на принимаемые данные.
size — размер принимамого блока данных
nmemb — общее количество блоков данных, объем принимаемой информации определяется как size * nmemb
stream — это параметр опции CURLOPT_WRITEDATA, в который производится запись.
Возвращать функция должна общий размер принятой информации.
size_t function( void *ptr, size_t size, size_t nmemb, void *stream) — объявление функции, параметра опции CURLOPT_READFUNCTION. Назначение всех аргументов аналогичное, только здесь выполняется чтение данных из исходного stream и передача libcurl через ptr. Возвращать функция должна общий размер переданной информации.
Теперь рассмотрим небольшой пример, показывающий инициализацию библиотеки, задание некоторых опций, а так же, знакомящий нас с еще одной важной функцией.
//подключение необходимых заголовочных файлов
#include <stdio.h>
#include <curl/curl.h>
//главная функция
int main(void)
{
//уже знакомый объект CURL
CURL *curl;
//объект - результат вызова функции curl_easy_perform
CURLcode res;
//выполняем инициализацю
curl = curl_easy_init();
if(curl) { //проверяем
//задаем опцию - получить страницу по адресу http://google.com
curl_easy_setopt(curl, CURLOPT_URL, "google.com");
//указываем прокси сервер
curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
//задаем опцию отображение заголовка страницы
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
//вызываем функцию, выполняющюю все операции, заданные в опциях (получение страницы, передача данных и т.д.), результат - объект типа CURLcode
res = curl_easy_perform(curl);
//выполняем обязательное завершение сессии
curl_easy_cleanup(curl);
}
return 0;
}
Пример крайне прост и понятен, комментарии излишни. Отмечу, что перед выполнением дальнейших действий с данным — необходимо проверить значение res, если резултат — 0, значит все прошло успешно, иначе — ошибка. Её описание можно получить, задав вышеописанный CURLOPT_ERRORBUFFER.
Теперь рассмотрим более серьезный пример, получающий и отображающий на стандартном выводе HTML страницу (разумеется в виде самого исходного языка разметки, без рендеринга). Будем использовать все необходимые проверки и функцию обратного вызова.
//подключаем необходимые заголовочные файлы
#include <string>
#include <iostream>
#include "curl/curl.h"
//подключаем стандартное пространство имен
using namespace std;
//объявляем буфер, для хранения возможной ошибки, размер определяется в самой библиотеке
static char errorBuffer[CURL_ERROR_SIZE];
//объялвяем буфер принимаемых данных
static string buffer;
//функция обратного вызова
static int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
//переменная - результат, по умолчанию нулевая
int result = 0;
//проверяем буфер
if (buffer != NULL)
{
//добавляем к буферу строки из data, в количестве nmemb
buffer->append(data, size * nmemb);
//вычисляем объем принятых данных
result = size * nmemb;
}
//вовзращаем результат
return result;
}
//главная функция
int main(void)
{
//необходимые CURL объекты
CURL *curl;
CURLcode result;
//инициализируем curl
curl = curl_easy_init();
//проверяем результат инициализации
if (curl)
{
//задаем все необходимые опции
//определяем, куда выводить ошибки
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
//задаем опцию - получить страницу по адресу http://google.com
curl_easy_setopt(curl, CURLOPT_URL, "google.com");
//указываем прокси сервер
curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
//задаем опцию отображение заголовка страницы
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
//указываем функцию обратного вызова для записи получаемых данных
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
//указываем куда записывать принимаемые данные
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &amp;amp;buffer);
//запускаем выполнение задачи
result = curl_easy_perform(curl);
//проверяем успешность выполнения операции
if (result == CURLE_OK)
//выводим полученные данные на стандартный вывод (консоль)
cout << buffer << "\n";
else
//выводим сообщение об ошибке
cout << "Ошибка! " << errorBuffer << endl;
}
//завершаем сессию
curl_easy_cleanup(curl);
return 0;
}
Добавлю к коду небольшие пояснения. Рассмотрим writer — функцию обратного вызова. Ее объявление нам уже знакомо. Функция должна возвращать общее количество принятых данных, иначе ошибка. Наша функция, в случае невыполнения действия записи в буфер будет возвращать значение result по умолчанию — 0. Собственно выполнение записи выполняется только в том случае, если буфер не является NULL. Т.к. мы работаем со строковыми данными — запись в буфер осуществляется вызовом метода append, класса string. Возвращаемое значение — произведение аргументов size и nmemb.
Задание опций дополнительных комментариев, думаю, не требует. После вызова curl_easy_perform происходит проверка возвращенного значения, если оно равно CURLE_OK (этот код определен в curl/curl.h) — происходит вывод содержимого буфера на экран (вывод можно организовать так же в файл или же передать другому приложению/участку, например html рендер-движку), иначе — выводится содержимое errorBuffer, содержащего текст ошибки. В самом конце происходит обязательное закрытие сесии. Этот же пример можно использовать для закачки файлов по фтп, заменив http на ftp, указав полный путь к файлу на сервере, а так же написав в функции writer код, пишуший получаемые байты в файл на диске. Разумеется, в таком случае, необходимо будет убрать вывод на экран.
Я постарался донести общие принципы использования этой библиотеки, больше примеров Вы можете найти в вышеописанном архиве, а так же на сайте разработчика: тема на форуме
Там же доступна обширная и полная документация.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)