반응형
libcurl 소개
libcurl은 URL 문법을 사용하여 데이터를 전송하는 데 사용되는 무료이자 오픈 소스 라이브러리입니다. HTTP, HTTPS, FTP, FTPS, SCP, SFTP 등 다양한 프로토콜을 지원합니다. libcurl은 간단하고 강력한 API를 제공하여 네트워크 프로그래밍을 쉽게 할 수 있게 해줍니다.
libcurl 설치
Windows
- vcpkg를 사용하여 설치:
vcpkg install curl
Linux
- apt를 사용하여 설치 (Debian/Ubuntu):
sudo apt-get install libcurl4-openssl-dev
- yum을 사용하여 설치 (CentOS/RHEL):
sudo yum install libcurl-devel
MacOS
- Homebrew를 사용하여 설치:
brew install curl
libcurl을 사용한 HTTP 클라이언트 구현
libcurl을 사용하여 HTTP 요청을 보내고, 응답을 처리하는 방법을 알아보겠습니다.
기본적인 GET 요청
#include <iostream>
#include <curl/curl.h>
// 콜백 함수: 수신한 데이터를 처리
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
int main() {
CURL* curl;
CURLcode res;
std::string readBuffer;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
} else {
std::cout << "응답 데이터: " << readBuffer << std::endl;
}
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
설명
위의 코드는 libcurl을 사용하여 HTTP GET 요청을 보내고, 응답을 출력하는 예제입니다.
- curl_easy_init(): CURL 핸들을 초기화합니다.
- curl_easy_setopt(): CURL 핸들에 옵션을 설정합니다.
CURLOPT_URL
: 요청할 URL을 설정합니다.CURLOPT_WRITEFUNCTION
: 응답 데이터를 처리할 콜백 함수를 설정합니다.CURLOPT_WRITEDATA
: 콜백 함수로 전달될 사용자 데이터를 설정합니다.
- curl_easy_perform(): 요청을 실행합니다.
- curl_easy_cleanup(): CURL 핸들을 정리합니다.
POST 요청
POST 요청 코드 예제
#include <iostream>
#include <curl/curl.h>
int main() {
CURL* curl;
CURLcode res;
std::string readBuffer;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/post");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=홍길동&age=30");
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
설명
위의 코드는 libcurl을 사용하여 HTTP POST 요청을 보내는 예제입니다.
- CURLOPT_POST: HTTP POST 메서드를 사용하도록 설정합니다.
- CURLOPT_POSTFIELDS: POST 요청으로 전송할 데이터를 설정합니다.
실습 문제
문제 1: libcurl을 사용하여 JSON 데이터를 POST로 전송하기
libcurl을 사용하여 JSON 데이터를 HTTP POST 요청으로 전송하세요.
해설:
#include <iostream>
#include <curl/curl.h>
#include <string>
int main() {
CURL* curl;
CURLcode res;
std::string readBuffer;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
std::string json_data = "{\"name\":\"홍길동\", \"age\":30}";
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/post");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
설명
위의 코드는 JSON 데이터를 HTTP POST 요청으로 전송하는 예제입니다.
- curl_slist_append(): HTTP 헤더를 설정합니다. 여기서는
Content-Type
헤더를 설정하여 JSON 데이터를 전송할 수 있도록 합니다. - CURLOPT_HTTPHEADER: 요청에 포함될 HTTP 헤더를 설정합니다.
이제 아홉 번째 날의 학습을 마쳤습니다. libcurl을 사용하여 HTTP 클라이언트를 개발하는 방법을 학습했습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "HTTP 서버 개발 (Boost.Beast)"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++ 네트워크 프로그래밍 시리즈' 카테고리의 다른 글
[C++ 네트워크 프로그래밍] Day 10: HTTP 서버 개발 (Boost.Beast) (0) | 2024.08.01 |
---|---|
[C++ 네트워크 프로그래밍] Day 11: RESTful API 설계와 구현 (0) | 2024.08.01 |
[C++ 네트워크 프로그래밍] Day 7: 네트워크 디버깅 기법 (0) | 2024.08.01 |
[C++ 네트워크 프로그래밍] Day 8: HTTP 프로토콜 개요 (0) | 2024.08.01 |
[C++ 네트워크 프로그래밍] Day 5: 네트워크 데이터 직렬화 (0) | 2024.08.01 |