[C language] Geany편집기 -12 . C - curl 통신, time(시스템 시간)
#정리
**콜백 함수 : 다른 함수의 인자로써 사용되어지는 함수
** 함수도 static을 붙일 수 있다.
#C -curl - 서버 연결//spring server 준비 (객체, String id, String pw 를 파라메터로 받을 수 있는 상태)
- json_c52curl_get.do?id="admin",pw="hi123456"
- json_c52curl_post.do //post 방식이어서 웹페이지로 결과 확인 불가
//리눅스 curl 통신 준비
- sudo apt install libcurl4-gnutls-dev
- gcc -Wall -o c52curl c52curl.c -lcurl
- #include <curl/curl.h> 선언 필요.//curl 통신 URL 설정
- CURL *curl;//CURL 타입 포인터 변수 설정
- char url_get[]="http://~";
- char url_post[]="http://~";
- char params_post[] = "id=admin&pw=hi123456";//curl 통신 (easy인터페이스)
- curl = curl_easy_init();//초기화 - cleanup();과 세트로 사용된다.- <1.get curl> / <2.post curl> 중 택 1
- curl_easy_perform(curl);//출력 기능이 있지만, 응답을 반환하지는 않는다.
- curl_easy_cleanup(curl);
<1.get curl>
- curl_easy_setopt(curl,CURLOPT_URL,url_get);//set option
<2.post curl>(post 방식은 postfield를 같이 써야한다.)
- curl_easy_setopt(curl,CURLOPT_URL,url_post);
- curl_easy_setopt(curl,CURLOPT_POSTFIELDS,params_post);
#curl - 서버 응답 받기 : curl 받아온 서버 응답 헤더정보를 출력하고, 응답 내용 파일로 저장하기
//서버 응답 내용 저장
<구조체 FILE 타입의 포인터 변수 생성 한뒤, 임의의 파일을 생성하여 easy_perform 내용 저장한다. >
- char* file_name = "c59json.txt"; //파일 이름 지정
- FILE* save_file = fopen(file_name,"w");//"w"-write : 파일 생성>> curl_easy_setopt(curl,CURLOPT_WRITEDATA,save_file);//생성한 파일에 curl_easy_perform( ) 실행 후 출력되는 내용을 저장.
// 서버 응답 헤더 정보 복사 및 출력
<1. 헤더 정보 복사를 위한 콜백 함수 생성>
- static size_t read_head_fun( ){ ~
- char head[2048] = {0};//복사받을 대상 메모리 생성
- memcpy(head,ptr,size*nmemb + 1); //memcpy : 메모리 복사 - #include 선언 필요//헤더 정보 메모리에 저장
- curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,read_head_fun);//read_had_fun(헤더정보 복사함수)를 통해 헤더 정보를 읽어와줘.
#c60parse_json - json 형식의 데이터 파싱해서 추출하기
//URL 타고 들어가서, 코드 복사 후 .c파일 생성(예문 코드 참조)
- 해당 파일을 헤더(라이브러리)로 활용한다.
//parse 연습용 .json 파일 생성(예문 코드 참조)
- json 형식의 데이터 정보를 넣는다.
//파일 내용 FILE 구조체에 저장
- FILE* read_file = fopen(file_name,"r"); //r-read 파일에 저장된 내용을 구조체로 저장 ~ fclose(); 세트로 사용
- fread(json_text,1,2048,read_file); //json_text:복사 할 공간,1:옵션,2048:json_text의 사이즈,read_file: 읽어올 정보
- fclose(read_file);
//읽어온 내용 Parsing
- json_value vos = json_create(json_str);//json형식으로 변환하여 vos에 할당. ~ json_free();까지 세트 작성 필요- printf("%d ",json_get_int(vo,"num")); //할당된 변수 값 출력 - double, bool, longlongint, string...타입 사용가능
- json_free(vos); //메모리 해제
# time - struct tm 시간 구조체, 함수 활용
//#include <time.h> 선언 필요
//시스템 시간을 문자열로 출력하는 두 가지 방법
<1.구조체 타입(struct tm) 변수를 이용하여 시간을 받는 방법>
- localtime() : time_t 타입을 struct tm 형태로 변환하여 반환해주는 함수- asctime() : struct tm 타입의 시간 값을 문자열의 형태로 변환 해주는 함수 (엔터기능 포함)
<2.time_t 타입의 변수를 이용하여 시간을 받는 방법>
- ctime() : time_t 시간 값을 문자열의 형태로 변환 해주는 함수 (엔터기능 포함)
#C - curl - 서버 연결
//spring server 준비 (객체, String id, String pw 를 파라메터로 받을 수 있는 상태)
- json_c52curl_get.do?id="admin",pw="hi123456"
- json_c52curl_post.do //post 방식이어서 웹페이지로 결과 확인 불가
//리눅스 curl 통신 준비
- sudo apt install libcurl4-gnutls-dev
- gcc -Wall -o c52curl c52curl.c -lcurl
- #include <curl/curl.h> 선언 필요.
//curl 통신 URL 설정
- CURL *curl;//CURL 타입 포인터 변수 설정
- char url_get[]="http://~";
- char url_post[]="http://~";
- char params_post[] = "id=admin&pw=hi123456";
//curl 통신 (easy인터페이스)
- curl = curl_easy_init();//초기화 - cleanup();과 세트로 사용된다.
- <1.get curl> / <2.post curl> 중 택 1
- curl_easy_perform(curl);//출력 기능이 있지만, 응답을 반환하지는 않는다.
- curl_easy_cleanup(curl);
<1.get curl>
- curl_easy_setopt(curl,CURLOPT_URL,url_get);//set option
<2.post curl>(post 방식은 postfield를 같이 써야한다.)
- curl_easy_setopt(curl,CURLOPT_URL,url_post);
- curl_easy_setopt(curl,CURLOPT_POSTFIELDS,params_post);
--예문 코드 보기--
#include <stdio.h>
#include <curl/curl.h>
//sudo apt install libcurl4-gnutls-dev
//gcc -Wall -o c52curl c52curl.c -lcurl
//#include <curl/curl.h> 선언 필요.
CURL *curl;//CURL 타입 포인터 변수 설정
char url_get[]="http://IP주소:8090/study/json_c52curl_get.do?id=admin&pw=hi123456";
char url_post[]="http://IP주소:8090/study/json_c52curl_post.do";
char params_post[] = "id=admin&pw=hi123456";
int main(int argc, char **argv)
{
printf("curl......\n");
curl = curl_easy_init();//초기화 - cleanup();과 세트로 사용된다.
printf("curl:%p\n",curl);
if(curl){
//1.get test
curl_easy_setopt(curl,CURLOPT_URL,url_get);//set option
//2.post test(post 방식은 postfield를 같이 써야한다.)
//curl_easy_setopt(curl,CURLOPT_URL,url_post);
//curl_easy_setopt(curl,CURLOPT_POSTFIELDS,params_post);
//.following code
curl_easy_perform(curl);//출력 기능이 있지만, 응답을 반환하지는 않는다.
//[{"num":0,"model":null,"brand":null,"type":null,"price":0,"accident":0,"booker":null,"bookdate":null,"owner":null,"tel":null},...]
curl_easy_cleanup(curl);
//printf("end....curl\n");
}
return 0;
}
**콜백 함수 : 다른 함수의 인자로써 사용되어지는 함수
** 함수도 static을 붙일 수 있다.
#curl - 서버 응답 받기 : curl 받아온 서버 응답 헤더정보를 출력하고, 응답 내용 파일로 저장하기
//서버 응답 내용 저장
- 구조체 FILE 타입의 포인터 변수 생성 한뒤, 임의의 파일을 생성하여 easy_perform 내용 저장한다.
- char* file_name = "c59json.txt"; //파일 이름 지정
- FILE* save_file = fopen(file_name,"w");//"w"-write : 파일 생성
>> curl_easy_setopt(curl,CURLOPT_WRITEDATA,save_file);//생성한 파일에 curl_easy_perform( ) 실행 후 출력되는 내용을 저장.
// 서버 응답 헤더 정보 복사 및 출력
<1. 헤더 정보 복사를 위한 콜백 함수 생성>
- static size_t read_head_fun( ){ ~
- char head[2048] = {0};//복사받을 대상 메모리 생성
- memcpy(head,ptr,size*nmemb + 1); //memcpy : 메모리 복사 - #include 선언 필요
//헤더 정보 메모리에 저장
- curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,read_head_fun);//read_had_fun(헤더정보 복사함수)를 통해 헤더 정보를 읽어와줘.
--예문 코드 보기--
#include <stdio.h>
#include <string.h> //memcpy : 메모리 복사
#include <curl/curl.h>
//sudo apt install libcurl4-gnutls-dev
//gcc -Wall -o c52curl c52curl.c -lcurl
//#include <curl/curl.h> 선언 필요.
CURL *curl;//CURL 타입 포인터 변수 설정
char url_get[]="http://IP주소:8090/study/json_c52curl_get.do?id=admin&pw=hi123456";
char url_post[]="http://IP주소:8090/study/json_c52curl_post.do";
char params_post[] = "id=admin&pw=hi123456";
//함수도 static을 붙일 수 있다. 구조체를 리턴한다.
static size_t read_head_fun(void *ptr,size_t size,size_t nmemb,void *stream){
//void *ptr : 정보 저장 할 포인트 변수
//size_t size, size_t nmemb : 메모리의 크기 설정
//void *stream : 스트림으로 넘어올 대상
//웹페이지 헤더정보 출력 준비
char head[2048] = {0};//복사받을 대상
memcpy(head,ptr,size*nmemb + 1);//ptr:복사할 데이터, size*nmemb:데이터길이, +1:문자열 여유값(null)
printf("%s\n",head);//HTTP/1.1 200
//Content-Type: application/json;charset=UTF-8
return size*nmemb;
}
int main(int argc, char **argv)
{
printf("curl......\n");
curl = curl_easy_init();//초기화 - cleanup();과 세트로 사용된다.
printf("curl:%p\n",curl);
char* file_name = "c59json.txt";
//구조체 FILE 타입의 포인터 변수
FILE* save_file = fopen(file_name,"w");//"w"-write : create file
//fclose(); 세트로 사용
if(curl){
//1.get test
//curl_easy_setopt(curl,CURLOPT_URL,url_get);//set option
//2.post test
curl_easy_setopt(curl,CURLOPT_URL,url_post);
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,params_post);
//.following code
curl_easy_setopt(curl,CURLOPT_WRITEDATA,save_file);//save_file에 easy_perform 실행 후 출력되는 내용을 저장.
curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,read_head_fun);//read_had_fun(헤더정보 복사함수)를 통해 헤더 정보를 읽어와줘.
curl_easy_perform(curl);//출력 기능이 있지만, 응답 내용을 바로 사용할 수 없다. >>옵션을 추가해야한다.
//[{"num":0,"model":null,"brand":null,"type":null,"price":0,"accident":0,"booker":null,"bookdate":null,"owner":null,"tel":null},...]
curl_easy_cleanup(curl);
//printf("end....curl\n");
fclose(save_file);
}
return 0;
}
#c60parse_json - json 형식의 데이터 파싱해서 추출하기
//URL 타고 들어가서, 코드 복사 후 .c파일 생성(예문 코드 참조)
- 해당 파일을 헤더(라이브러리)로 활용한다.
//parse 연습용 .json 파일 생성(예문 코드 참조)
- json 형식의 데이터 정보를 넣는다.
//파일 내용 FILE 구조체에 저장
- FILE* read_file = fopen(file_name,"r"); //r-read 파일에 저장된 내용을 구조체로 저장 ~ fclose(); 세트로 사용
- fread(json_text,1,2048,read_file); //json_text:복사 할 공간, 1:옵션, 2048:json_text의 사이즈, read_file: 읽어올 정보
- fclose(read_file);
//읽어온 내용 Parsing
- json_value vos = json_create(json_str);//json형식으로 변환하여 vos에 할당. ~ json_free();까지 세트 작성 필요
- printf("%d ",json_get_int(vo,"num")); //할당된 변수 값 출력 - double, bool, longlongint, string...타입 사용가능
- json_free(vos); //메모리 해제
--예문 코드 보기--
#include <stdio.h>
#include "c60json_c.c"
//http://github.com/kcoms555/json_c/blob/master/json_c.c 에서 소스 코드 복사
//c60json_c.c 파일 생성후, 복사한 소스 코드 붙여넣기.
//외부 파일 임포트를 위해 #include "c60json_c.c" 선언
//c60json.json 파일 생성 후, json 형식으로 작성된 데이터 정보 저장.
int main(int argc, char **argv)
{
printf("parson.h...\n");
//파일 정보 FILE 구조체에 저장
char json_text[2048] = {0};//복사받을 대상
char* file_name = "c60json.json";
FILE* read_file = fopen(file_name,"r");//r-read 파일에 저장된 내용을 구조체로 저장 ~ fclose(); 세트로 사용
fread(json_text,1,2048,read_file);//json_text:복사 할 공간, 1:옵션, 2048:json_text의 사이즈, read_file: 읽어올 정보
printf("%s\n",json_text);
fclose(read_file);
//읽어온 내용 Parsing
char* json_str = json_text;//아래 json_create()가 포인터 변수를 매개변수로 받아서 타입을 바꿔준 것.
json_value vos = json_create(json_str);//json형식으로 변환하여 vos에 할당. ~ json_free();까지 세트 작성 필요
printf("json_len(vos): %d\n",json_len(vos));//데이터 덩어리 수 확인
json_print(vos);//json parse해서 화면에 출력
putchar('\n');//줄 정리용 enter
printf("=========================\n");
for(int i=0;i<json_len(vos);i++){
json_value vo = json_get(vos,i);
json_print(vo);putchar('\n');
//null값을 읽어올 수 없다. >> 서버에서 보내 줄 때 null값을 string으로 처리해서 보내야한다.
printf("%d ",json_get_int(vo,"num"));//double, bool, longlongint, string...
printf("%s ",json_get_string(vo,"model"));
printf("%s ",json_get_string(vo,"brand"));
printf("%s ",json_get_string(vo,"type"));
printf("%d ",json_get_int(vo,"price"));
printf("%d ",json_get_int(vo,"accident"));
printf("%s ",json_get_string(vo,"booker"));
printf("%s ",json_get_string(vo,"bookdate"));
printf("%s ",json_get_string(vo,"owner"));
printf("%s \n",json_get_string(vo,"tel"));
}
json_free(vos);
return 0;
}
# time - struct tm 시간 구조체, 함수 활용
** https://blockdmask.tistory.com/417 << 여기에 설명 잘 나와있음
//#include <time.h> 선언 필요
//시스템 시간을 문자열로 출력하는 두 가지 방법
<1.구조체 타입(struct tm) 변수를 이용하여 시간을 받는 방법>
- localtime() : time_t 타입을 struct tm 형태로 변환하여 반환해주는 함수
- asctime() : struct tm 타입의 시간 값을 문자열의 형태로 변환 해주는 함수 (엔터기능 포함)
<2.time_t 타입의 변수를 이용하여 시간을 받는 방법>
- ctime() : time_t 시간 값을 문자열의 형태로 변환 해주는 함수 (엔터기능 포함)
--예문 코드 보기--
#include <stdio.h>
#include <time.h>
void local_time_tm(){
//시스템 시간을 문자열로 출력하는 두 가지 방법
//#include <time.h> 선언.
//1.구조체 타입(struct tm) 변수를 이용하여 시간을 받는 방법.
struct tm *pt_time;
time_t rawTime;
time(&rawTime);//현재 시간을 받음. time(NULL);과 동일 효과(2번 방식 참조)
printf("rawTime:%ld\n",rawTime);
pt_time = localtime(&rawTime);//time_t 타입을 struct tm 형태로 변환하여 반환.
char *realTime = asctime(pt_time);//struct tm 타입의 시간 값을 문자열로 정리하여 반환.
printf("result_asctime:%s",realTime);
char *wdate = asctime(pt_time);//반환되는 문자열 시간을 wdate에 할당.
printf("wdate:%s",wdate);
//localtime() : time_t 타입을 struct tm 형태로 변환하여 반환해주는 함수
//asctime() : struct tm 타입의 시간 값을 문자열의 형태로 변환 해주는 함수 (엔터기능 포함)
}
void local_time_pt(){
//2.time_t 타입의 변수를 이용하여 시간을 받는 방법.
time_t rawTime;
rawTime = time(NULL);
printf("rawTime:%ld\n",rawTime);
char* realTime = ctime(&rawTime);
printf("result_ctime: %s",realTime);
//ctime() : time_t 시간 값을 문자열의 형태로 변환 해주는 함수 (엔터기능 포함)
}
int main(int argc, char **argv)
{
printf("time...\n");
printf("------tm------\n");
local_time_tm();
printf("------pt------\n");
local_time_pt();
return 0;
}