Как использовать библиотеку C++ LibCurl
Как использовать библиотеку C++ LibCurl

LibCurl - это бесплатная многопротокольная библиотека с открытым исходным кодом для передачи данных с открытым исходным кодом.,Фреймворк является кроссплатформенным,Открытый исходный код и бесплатно,и обеспечиваетHTTPFTPSMTPPOP3Функции других протоколов,использоватьlibcurlМожет легко подключиться к сетиданныеоперация переноса,Если отправленоHTTPпросить、Скачать файл, отправить электронное письмо и т. д. Он широко используется при разработке различных сетевых приложений.,Особенно сцены, связанные с передачей данных.

Во-первых, читателям необходимо скачать библиотеку самостоятельно.,Автор выбирает загрузку следующим образомcurl-8.0.1.zipЭта версия исходного кода,Читатели могут найти следующие страницы,И нажмите на соответствующую версию, чтобы завершить загрузку.,После загрузки читатели могут разархивировать его в любой каталог.

Когда читатель распаковывает,Можно открытьКомандная строка разработчика VS2013и переключитесь с помощьюcurl-8.0.1\winbuildОглавление,Выполнив следующие две команды, вы можете скомпилировать статические или динамические библиотеки соответственно.,В основном мы компилируем статические библиотеки,Читатели могут подождать некоторое время после выполнения следующей команды.

  • Динамическая библиотека: nmake /f Makefile.vc mode=dll VC=13 MACHINE=x86 DEBUG=no
  • Статическая библиотека: nmake /f Makefile.vc mode=static VC=13 ENABLE_IDN=нет MACHINE=x86 DEBUG=нет

После того, как эта библиотека скомпилирована и передана, она автоматически сгенерирует файлы дляbuilds\libcurl-vc13-x86-release-static-ipv6-sspi-schannelОглавление Внутри,Читатели могут открыть этот каталог самостоятельно.,В этом каталоге вы можете увидеть файлы заголовков и файлы каталога библиотеки.,Как показано на рисунке ниже;

Читатели могут настроить эту статическую библиотеку самостоятельно.,Обычно требуется только настроитьincludeиlibПросто файл,Использовать эту библиотеку просто,Сначала нам нужно позвонитьcurl_easy_init()функцияверноCURLверно Инициализировать объект,Затем, позвонивcurl_easy_setopt()и зайти в гостиURLСвязь,Если доступ успешен, его можно вызватьcurl_easy_perform()функция Получить результаты доступа,Это основное использование библиотеки.,Следующий код.

Язык кода:javascript
копировать
#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Это означает блокировку всего содержимого вывода страницы.。

Язык кода:javascript
копировать
#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Способ来обозначениеактерское мастерствоадрес,

Язык кода:javascript
копировать
#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в указателеизданныесохранить локально,Код для реализации этого выглядит следующим образом:

Язык кода:javascript
копировать
#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Внутри,и вернуть буфер вызывающему абоненту,Ниже приведен полный исходный код.

Язык кода:javascript
копировать
#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 Лицензионное соглашение. При перепечатке просьба указывать источник!

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода