C/C++ 애플리케이션에서 Libcurl 사용

클라이언트 URL 또는 단순히 curl은 다양한 네트워크 프로토콜을 사용하여 데이터를 전송하기 위한 명령줄 도구입니다. 일반적으로 개발자가 HTTP를 기반으로 빌드된 다양한 응용 프로그램을 테스트하는 데 사용됩니다.

즉, curl 자체는 libcurl을 둘러싼 래퍼일 뿐입니다. 라이브러리는 C로 작성되었으며 잘 문서화된 API가 있습니다. 이 게시물에서는 C/C++ 응용 프로그램에서 HTTP 요청을 만들기 위해 libcurl을 사용하는 방법을 보여줍니다.

시작하기 전에 C 컴파일러가 설치되어 있는지 확인하십시오. 나는 gcc를 사용할 것이다. 다른 컴파일러도 작동하지만 제공된 Makefile을 수정해야 합니다. 또한 curl 및 libcurl이 설치되어 있어야 합니다. Linux 및 OSX에서 CLI에서 curl 명령을 사용할 수 있다면 잘해야 합니다.

간단한 Makefile을 만드는 것으로 시작하겠습니다.

메이크파일

default: build

build: clean
    gcc -Wall -o curl main.c util.c -l curl 

clean:
    rm -rf curl 

test: build
    ./curl https://freegeoip.app/json/ 


이제 애플리케이션으로 이동합니다. URL을 인수로 받아 HTTP Get 요청을 하고 응답을 출력하는 간단한 CLI 도구입니다.

코드는 다음과 같습니다.

메인.c

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

int main(int argc, char *argv[]) {
  if( argc != 2 ) {
    printf("usage: try './curl [url]' to make a get request.\n");
    return 1;
  }

  CURL *curl_handle;
  CURLcode res;

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

  curl_handle = curl_easy_init();
  if(curl_handle) {
    curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);
    curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    res = curl_easy_perform(curl_handle);

    if(res != CURLE_OK) {
      fprintf(stderr, "error: %s\n", curl_easy_strerror(res));
    } else {
      printf("Size: %lu\n", (unsigned long)chunk.size);
      printf("Data: %s\n", chunk.memory);
    }
    curl_easy_cleanup(curl_handle);
    free(chunk.memory);
  }
  return 0;
}


util.h

#ifndef UTIL_H
#define UTIL_H

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

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

size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp);

#endif


util.c

#include "util.h"

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

  char *ptr = realloc(mem->memory, mem->size + realsize + 1);
  if(ptr == NULL) {
    printf("error: not enough memory\n");
    return 0;
  }

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

  return realsize;
}



여기서 가장 흥미로운 함수는 curl_easy_setopt 입니다. curl 클라이언트의 인스턴스에 다양한 옵션을 설정합니다(내 예에서는 curl_handle ). CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA를 설정함으로써 curl_handle 응답 데이터를 쓰기 위한 사용자 지정 논리 및 위치를 사용하도록 구성했습니다.

마찬가지로 사용자 정의 헤더 또는 HTTP Post 페이로드를 설정할 수 있습니다. 사용 가능한 모든 옵션 목록은 curl docs 을 참조하십시오.

좋은 웹페이지 즐겨찾기