LibCurl - это бесплатная многопротокольная библиотека с открытым исходным кодом для передачи данных с открытым исходным кодом.,Фреймворк является кроссплатформенным,Открытый исходный код и бесплатно,и обеспечиваетHTTP
、FTP
、SMTP
、POP3
Функции других протоколов,использоватьlibcurl
Может легко подключиться к сетиданныеоперация переноса,Если отправленоHTTP
просить、Скачать файл, отправить электронное письмо и т. д. Он широко используется при разработке различных сетевых приложений.,Особенно сцены, связанные с передачей данных.
Во-первых, читателям необходимо скачать библиотеку самостоятельно.,Автор выбирает загрузку следующим образомcurl-8.0.1.zip
Эта версия исходного кода,Читатели могут найти следующие страницы,И нажмите на соответствующую версию, чтобы завершить загрузку.,После загрузки читатели могут разархивировать его в любой каталог.
Когда читатель распаковывает,Можно открытьКомандная строка разработчика VS2013
и переключитесь с помощьюcurl-8.0.1\winbuild
Оглавление,Выполнив следующие две команды, вы можете скомпилировать статические или динамические библиотеки соответственно.,В основном мы компилируем статические библиотеки,Читатели могут подождать некоторое время после выполнения следующей команды.
После того, как эта библиотека скомпилирована и передана, она автоматически сгенерирует файлы дляbuilds\libcurl-vc13-x86-release-static-ipv6-sspi-schannel
Оглавление Внутри,Читатели могут открыть этот каталог самостоятельно.,В этом каталоге вы можете увидеть файлы заголовков и файлы каталога библиотеки.,Как показано на рисунке ниже;
Читатели могут настроить эту статическую библиотеку самостоятельно.,Обычно требуется только настроитьinclude
иlib
Просто файл,Использовать эту библиотеку просто,Сначала нам нужно позвонитьcurl_easy_init()
функцияверноCURL
верно Инициализировать объект,Затем, позвонивcurl_easy_setopt()
и зайти в гостиURL
Связь,Если доступ успешен, его можно вызватьcurl_easy_perform()
функция Получить результаты доступа,Это основное использование библиотеки.,Следующий код.
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"
#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")
using namespace std;
int main(int argc, char *argv[])
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "https://www.lyshark.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
std::cout << «Статус возврата: " << res << std::endl;
system("pause");
return 0;
}
Запустите приведенный выше код,Читатели могут видеть сайтwww.lyshark.com
исходный код,Как показано на рисунке ниже;
в приведенном выше кодеcurl_easy_setopt()
функциявторойпараметр Можетиспользоватьмного типовизопределение переменной,Мы можем определить параметры в заголовке запроса, передавая разные константы.,Например, когда нам нужно изменить заголовок протокола,МожетиспользоватьCURLOPT_HTTPHEADER
постоянный,И передайте структуру, соответствующую константе в третьем параметре.,Это определение структуры имеет много типов.,Подробности показаны в таблице ниже;
постоянное имя | описывать |
---|---|
CURLINFO_EFFECTIVE_URL | Последний действительный URL-адрес |
CURLINFO_HTTP_CODE | Последний полученный HTTP-код |
CURLINFO_FILETIME | Время, когда документ был получен удаленно. Если его невозможно получить, возвращаемое значение равно -1. |
CURLINFO_TOTAL_TIME | Время, затраченное на последний перевод |
CURLINFO_NAMELOOKUP_TIME | Время, потраченное на разрешение имени |
CURLINFO_CONNECT_TIME | Время, необходимое для установления соединения |
CURLINFO_PRETRANSFER_TIME | Время, прошедшее от установления соединения до подготовки к передаче |
CURLINFO_STARTTRANSFER_TIME | Время, прошедшее от установления соединения до начала передачи |
CURLINFO_REDIRECT_TIME | Количество времени, потраченное на перенаправление до начала передачи транзакции. |
CURLINFO_SIZE_UPLOAD | Возвращает общий объем загруженных данных в байтах |
CURLINFO_SIZE_DOWNLOAD | Возвращает общий объем загруженных данных в байтах. |
CURLINFO_SPEED_DOWNLOAD | средняя скорость загрузки |
CURLINFO_SPEED_UPLOAD | средняя скорость загрузки |
CURLINFO_HEADER_SIZE | Размер заголовочной части |
CURLINFO_HEADER_OUT | Отправить запрошенную строку |
CURLINFO_REQUEST_SIZE | Размер рассматриваемого запроса в HTTP-запросе |
CURLINFO_SSL_VERIFYRESULT | Результат запроса на проверку сертификата SSL, возвращаемый установкой CURLOPT_SSL_VERIFYPEER. |
CURLINFO_CONTENT_LENGTH_DOWNLOAD | Длина содержимого загрузки, считанная из поля Content-Length: |
CURLINFO_CONTENT_LENGTH_UPLOAD | Инструкции по размеру загрузки |
CURLINFO_CONTENT_TYPE | Значение Content-Type: NULL указывает, что сервер не отправил действительный заголовок Content-Type:. |
Следующий случай представляет собой простойGET
просить Инкапсуляция,ПозвонивGetStatus()
функциявыполнитьверно Инициировано конкретной страницейпроситьиз Функция,вcurl_slist_append()
используется для добавления новыхизпроситьголоваданные,звонюcurl_easy_setopt()
функциячас,Передано отдельноCURLOPT_HTTPHEADER
Установить заголовок запроса,CURLOPT_WRITEFUNCTION
Установить обратный вызов,CURLINFO_PRIMARY_IP
Получить цельIP
адрес,CURLINFO_RESPONSE_CODE
Получить целькод возврата,Вотwrite_data()
функция Возврат напрямую0Это означает блокировку всего содержимого вывода страницы.。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"
#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")
using namespace std;
// Установите функцию обратного вызова CURLOPT_WRITEFUNCTION и верните ее в пустое значение, чтобы замаскировать вывод.
static size_t write_data(char *d, size_t n, size_t l, void *p)
{
return 0;
}
// Получите возвратную стоимость веб-сайта
void GetStatus(char *UrlPage)
{
CURLcode return_code;
// Модуль инициализации
return_code = curl_global_init(CURL_GLOBAL_WIN32);
if (CURLE_OK != return_code)
{
return;
}
// Инициализировать и заполнить заголовки запроса
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0)");
headers = curl_slist_append(headers, "Referer: https://www.lyshark.com");
// Инициализировать библиотеку запросов
CURL *easy_handle = curl_easy_init();
if (NULL != easy_handle)
{
// CURLOPT_HTTPHEADER Настройте заголовки запросов
curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers);
// CURLOPT_URL Специально запрошенный веб-сайт
curl_easy_setopt(easy_handle, CURLOPT_URL, UrlPage);
// CURLOPT_WRITEFUNCTION Установить функцию обратного вызова, выход экрана
curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data);
// Выполните CURL для доступа к веб-сайту.
return_code = curl_easy_perform(easy_handle);
char *ipAddress = { 0 };
// CURLINFO_PRIMARY_IP Получить информацию о целевом IP
return_code = curl_easy_getinfo(easy_handle, CURLINFO_PRIMARY_IP, &ipAddress);
if ((CURLE_OK == return_code) && ipAddress)
{
std::cout << «Целевой IP: " << ipAddress << std::endl;
}
long retcode = 0;
// CURLINFO_RESPONSE_CODE Получить целевой статус возврата
return_code = curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE, &retcode);
if ((CURLE_OK == return_code) && retcode)
{
std::cout << «Код возврата: " << retcode << std::endl;
}
}
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
}
int main(int argc, char *argv[])
{
GetStatus("https://www.lyshark.com");
system("pause");
return 0;
}
Запустите приведенный выше код,тогда ты сможешь получитьwww.lyshark.com
целевой хостIPадреси статус возврата страницы,Как показано на рисунке ниже;
Конечно, библиотека также поддерживаетPOST
просить Способ,существоватьиспользоватьPOST
проситьчас我们МожетпроходитьCURLOPT_COOKIEFILE
параметробозначениеCookie
параметр,проходитьCURLOPT_POSTFIELDS
обозначениеPOST
изданныенабор,И если понадобитсяиспользоватьактерское мастерство模式则МожетпроходитьCURLOPT_PROXY
Способ来обозначениеактерское мастерствоадрес,
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"
#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")
using namespace std;
bool SendPost(char *Url, char *Cookie, char *PostVal)
{
CURL *curl;
CURLcode res;
// Библиотека инициализации
curl = curl_easy_init();
if (curl)
{
// Установить заголовок запроса
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0)");
headers = curl_slist_append(headers, "Referer: https://www.lyshark.com");
// Установить заголовок запроса
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// Укажите URL
curl_easy_setopt(curl, CURLOPT_URL, Url);
// Укажите параметры cookie
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, Cookie);
// Укажите содержание публикации
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, PostVal);
// Быть ли агентом
// curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return true;
}
int main(int argc, char *argv[])
{
// Входящий URL cookie и параметры публикации
SendPost("https://www.lyshark.com/post.php", "1e12sde342r2", "&logintype=uid&u=xieyan&psw=xxx86");
system("pause");
return 0;
}
Для вызова этой функции требуется структура POST, прежде чем ее можно будет протестировать. Поскольку я не указал интерфейс, было возвращено сообщение об ошибке страницы, как показано на рисунке ниже;
Далее продолжаем реализовывать функцию загрузки страницы на локальный,该Функциявыполнитьиз Принцип заключается в использованииwrite_data
перезвонитьфункция,Функция обратного вызова срабатывает, когда данные страницы считываются в память.,в этомперезвонитьфункцияиз Внутриотделение Позвонивfwrite
функция Воляptr
в указателеизданныесохранить локально,Код для реализации этого выглядит следующим образом:
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"
#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")
using namespace std;
FILE *fp;
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
int written = fwrite(ptr, size, nmemb, (FILE *)fp);
return written;
}
BOOL GetUrl(char *URL, char *FileName)
{
CURL *curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, URL);
// Распечатать процесс подключения запроса и вернуть httpданные на экран
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
// Время поиска, чтобы предотвратить слишком глубокий поиск
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);
// Установить таймаут соединения
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
// Настройка таймаута при получении данных
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
if ((fp = fopen(FileName, "w")) == NULL)
{
curl_easy_cleanup(curl);
return FALSE;
}
// CURLOPT_WRITEFUNCTION Обработка последующих действий для функции write_data.
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
return TRUE;
}
int main(int argc, char *argv[])
{
// Загрузите веб-страницы на локальный
GetUrl("https://www.lyshark.com", "./lyshark.html");
system("pause");
return 0;
}
Когда читатель запускает вышеуказанную программу,Вот и все Воляwww.lyshark.com
Исходный код страницы сайта,Скачать в местный текущий Оглавление Внизlyshark.html
,Выходной эффект Как показано на рисунке ниже;
Чтобы иметь возможность анализировать параметры,Нам все еще нужно прочитать исходный код страницы в память.,Выполнить это требование не сложно,Сначала мы определяемstd::string
контейнер,Потом, когда появится новыйданныепроизводитьчаскурокWriteCallback
в этомфункция Внутри,Копируем данные непосредственно в указатель памяти,То есть хранится вread_buffer
Внутри,и вернуть буфер вызывающему абоненту,Ниже приведен полный исходный код.
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>
#include "curl/curl.h"
#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")
using namespace std;
// Функция обратного звонка магазина
size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
// Получите данные и поместите их в строку.
std::string GetUrlPageOfString(std::string url)
{
std::string read_buffer;
CURL *curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl)
{
// Игнорировать проверку сертификата
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
// Перенаправление
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
// URL-путь
curl_easy_setopt(curl, CURLOPT_URL, url);
// Время поиска, чтобы предотвратить слишком глубокий поиск
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);
// Тайм-аут соединения
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
// Настройка таймаута при получении данных
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
// Написать функцию обратного вызова
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
return read_buffer;
}
return "None";
}
int main(int argc, char *argv[])
{
std::string urls = GetUrlPageOfString("https://www.lyshark.com");
std::cout << «Получить длину: " << urls.length() << " bytes" << std::endl;
system("pause");
return 0;
}
Как показано ниже,Это длина выходной памяти после запуска,Конечно, мы также можем напрямую вывестиurls
серединаизданные,То есть исходный код веб-страницы;
Автор этой статьи: Ван Жуй Ссылка на эту статью: https://www.lyshark.com/post/6aa9753b.html Заявление об авторских правах: Если не указано иное, во всех статьях этого блога используются BY-NC-SA Лицензионное соглашение. При перепечатке просьба указывать источник!