libcurl 라이브러리
https://curl.se/libcurl/
다양한 프로토콜을 지원하는 파일(메시지) 전송 라이브러리이다.
C 언어로 작성되었으며 FTP, HTTP, HTTPS, IMAP, MQTT, POP3, SFTP 등 다양한 프로토콜을 지원한다.
다양한 OS에서 빌드 및 테스트된 바이너리 형태의 라이브러리로 제공한다.
주로 리눅스 OS에서 curl 명령어로 기능을 자주 사용하며 원하는 파일/ 메시지를 전송 할 수 있다.
libcurl 라이브러리를 래핑하여 편리하게 사용하는 소스도 많이 검색된다.
다운로드 및 설치
https://curl.se/download.html
해당 페이지에서 압축 파일을 받아서 압축을 풀어 projects 폴더내의 curl-all.sln 프로젝트 솔루션을 찾는다.
projects/Windows/VCXX 폴더들이 있는데 설치한 VisualStudio 버전에 따라 알맞은 툴 버전을 선택한다.
VS2022의 경우 VS17에 해당, VS2017/2019의 경우 VS15내의 솔루션을 선택한다.
솔루션에서 빌드 설정의 경우 Lib Debug - DLL Windows SSPI 를 선택하고 빌드한다. 해당 선택은 정적 라이브러리를 빌드하며 동적 라이브러리의 경우 DLL Debug - DLL Windows SSPI를 선택한다.
SSPI의 경우 HTTPS와 같은 SSL 인터넷 보안 프로토콜을 사용하는 경우 필요한 프로토콜 기능을 설치하기위해 필요하다.
curl 프로젝트의 경우 libcurl 라이브러리를 사용하는 tool_main.c에 해당하는 테스트 실행 파일(.exe)를 만들어내고
libcurl 프로젝트가 동적/정적 라이브러리를 만들어낸다.
자신이 사용하는 프로젝트에서 libcurl을 사용할 경우 curl 프로젝트 구성 설정을 참고하여 설정하면 된다.
정적 라이브러리 링크
출력 라이브러리는 build/Win64(32)/VC17/($Configuration) 폴더내에 생성된다.
해당 파일들을 자신의 프로젝트의 라이브러리만 모은 특정 폴더내로 복사한 경로 혹은 해당 폴더 경로를 구성-링커-일반-추가 라이브러리 디렉터리로 추가한다.
또한 libcurl 정적 라이브러리가 정적으로 참조하는 라이브러리를 추가해야한다. 윈도우 소켓이나 암호화 관련 라이브러리이다.
구성-링커-입력-추가 종속성에 다음을 추가한다.
ws2_32.lib
wldap32.lib
crypt32.lib
libcurld.lib
include 폴더 내에는 헤더 파일로 포함시켜야하는 파일들이 있다.
마찬가지로 자신의 프로젝트의 포함 디렉터리로 복사하거나 해당 경로를 구성-VC++ 디렉터리-포함 디렉터리 경로에 추가한다.
위 과정이 일반적인 정적 라이브러리를 링크하는 방법이다.
추가적으로 libcurl 정적 라이브러리를 사용하는 경우 전처리기에 CURL_STATICLIB 정의를 추가해야한다.
이를 추가하지 않으면 정적 라이브러리의 경우 링크 에러가 발생한다.
동적 라이브러리의 경우 출력 라이브러리 중 libcurl.dll을 실행 파일 경로에 복사해야 한다.
이제 관련 헤더를 포함시키고 함수를 사용하면 링크 에러없이 컴파일되어야한다.
HTTP GET 예제 - https://curl.se/libcurl/c/https.html
curl_define.h
#pragma once
#ifndef _CURL_DEFINE_
#define _CURL_DEFINE_
#include <cstdio>
#include <curl/curl.h>
#include <curl/curlver.h>
#include <curl/easy.h>
#include <curl/urlapi.h>
#endif // !_CURL_DEFINE_
main.cpp
#include <stdio.h>
#include "curl_define.h"
int main(void)
{
CURL* curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
#ifdef SKIP_PEER_VERIFICATION
/*
* If you want to connect to a site who is not using a certificate that is
* signed by one of the certs in the CA bundle you have, you can skip the
* verification of the server's certificate. This makes the connection
* A LOT LESS SECURE.
*
* If you have a CA cert for the server stored someplace else than in the
* default bundle, then the CURLOPT_CAPATH option might come handy for
* you.
*/
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
#endif
#ifdef SKIP_HOSTNAME_VERIFICATION
/*
* If the site you are connecting to uses a different host name that what
* they have mentioned in their server certificate's commonName (or
* subjectAltName) fields, libcurl will refuse to connect. You can skip
* this check, but this will make the connection less secure.
*/
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
#endif
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
'Advanced C++' 카테고리의 다른 글
[C++] libcurl (3) 공개 API를 사용해보자 : HTTP POST (0) | 2022.04.18 |
---|---|
[C++] libcurl (2) 공개 API를 사용해보자 : HTTP GET (1) | 2022.04.17 |
[C++] 멀티 스레드 응용 프로그램 : 은행 창구 시스템 구현하기 (0) | 2022.03.27 |
[C++] C++20 동시성 컨테이너를 사용하여 ThreadPool 설계하기 (0) | 2022.03.26 |
[C++] 정규식 표현 std::regex으로 문자열 찾기 (0) | 2022.02.07 |