본문 바로가기

PROGRAMMING/C

C언어로 HTTP/POST 보내기(curl.h , libcurl)

  • 오픈소스로 제공되는 프로그램에서 내가 필요한 데이터만 뽑아내서 python flask web server로 전송 하려고함.
  • 오픈소스 프로그램이 C언어다.
  • C를 능숙하게 다루는 편이 아님.
  • C 프로그램에서 생성되는 데이터를 python web server(flask)로 전송하고 web server에서 데이터를 가공하고 싶음.
  • C 프로그램에서 web server로 post 하는 방법을 찾아봤음.
  • curl/curl.h 를 알게됨.
  • linux 커맨드에서 CURL 과 curl/curl.h 정보를 구분하기 위해 curl/curl.h는 libcurl로 말하는듯

  http-post.c 코드

  • 실제 사용할 C 프로그램에 적용전 테스트 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <curl/curl.h>
 
int main(void)
{
  CURL *curl;
  CURLcode res;
 
  /* In windows, this will init the winsock stuff */
  curl_global_init(CURL_GLOBAL_ALL); // 이 옵션은 thread 메모리 공유에 안전하지 않다. 나는 주석처리함
 
  /* get a curl handle */
  curl = curl_easy_init();
 
  struct curl_slist *list = NULL;
 
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "XXX.XXX.XXX.XXX:8008/curlc"); //webserver ip 주소와 포트번호, flask 대상 router
    
    list = curl_slist_append(list, "Content-Type: application/json"); // content-type 정의 내용 list에 저장 
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); // content-type 설정
    
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); // 값을 false 하면 에러가 떠서 공식 문서 참고함 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L); // 값을 false 하면 에러가 떠서 공식 문서 참고함
 
    curl_easy_setopt(curl, CURLOPT_POST, 1L); //POST option
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS,"data"); //string의 data라는 내용을 전송 할것이다
 
    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl); // curl 실행 res는 curl 실행후 응답내용이 
    curl_slist_free_all(list); // CURLOPT_HTTPHEADER 와 세트
 
    /* 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_easy_init 과 세트
  }
  curl_global_cleanup(); // curl_global_init 과 세트
  return 0;
 
  }
 
}
cs



  Compile
  • 컴파일 커맨드 :

$ gcc -o http-post http-post.c -lcurl


  • makefile : cflags, LIBS 옵션 추가


앞에 어떤 조건이 있든 -lcurl만 추가 (CFLAGS가 아니라 다른 이름으로 쓸 수 있다)