[ C ] Sample Code - curl - 네이버 블러그 RSS 읽어오기

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <curl/curl.h>

int main() {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://rss.blog.naver.com/qnfmfmd_.xml");
        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;
}

/*************************************************8

libcurl 라이브러리 다운로드
libcurl 공식 사이트(https://curl.se/download.html)에서
원하는 운영체제와 버전을 선택하여 다운로드합니다.
여기서는 Windows 용으로 다운로드합니다.

프로젝트에 libcurl 추가
Visual Studio에서 프로젝트를 생성하거나 엽니다.
프로젝트 우클릭 -> 속성 -> 구성 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리 항목에
다운로드한 libcurl 라이브러리의 include 폴더 경로를 추가합니다.

libcurl 라이브러리 링크 설정
위에서 추가한 include 폴더에 있는 .lib 파일과 .dll 파일을 프로젝트에 링크합니다.
구성 속성 -> 링커 -> 일반 -> 추가 라이브러리 디렉터리 항목에
libcurl 라이브러리의 lib 폴더 경로를 추가합니다.
그리고 구성 속성 -> 링커 -> 입력 -> 추가 종속성 항목에 libcurl.dll.a 파일명을 추가합니다.

*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

* arm64 m1 macbook CLion 환경에서 실행

 

* CMakeLists.txt

cmake_minimum_required(VERSION 3.24)
project(untitled C)

set(CMAKE_C_STANDARD 11)

add_executable(untitled main.c)
target_link_libraries(untitled curl)  // <-  추가

 

 

* main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

#define BUFSIZE 1024

struct MemoryStruct {
    char *memory;
    size_t size;
};

static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t realsize = size * nmemb;
    struct MemoryStruct *mem = (struct MemoryStruct *) userp;

    mem->memory = realloc(mem->memory, mem->size + realsize + 1);
    if (mem->memory == NULL) {
        printf("Not enough memory (realloc returned NULL)\n");
        return 0;
    }

    memcpy(&(mem->memory[mem->size]), contents, realsize);
    mem->size += realsize;
    mem->memory[mem->size] = 0;

    return realsize;
}

int main(void) {
    CURL *curl_handle;
    CURLcode res;

    struct MemoryStruct chunk;
    chunk.memory = malloc(1);
    chunk.size = 0;

    curl_global_init(CURL_GLOBAL_ALL);

    curl_handle = curl_easy_init();
    curl_easy_setopt(curl_handle, CURLOPT_URL, "https://rss.blog.naver.com/qnfmfmd_.xml");
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
    res = curl_easy_perform(curl_handle);
    curl_easy_cleanup(curl_handle);

    if(res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        return 1;
    }

    printf("%s\n", chunk.memory);

    free(chunk.memory);
    curl_global_cleanup();

    return 0;
}