C lang

[C language] Geany편집기 -12 . C - curl 통신, time(시스템 시간)

걍작 2022. 3. 29. 00:10

#정리

**콜백 함수 : 다른 함수의 인자로써 사용되어지는 함수
** 함수도 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 방식이어서 웹페이지로 결과 확인 불가

(좌) get 방식 / (우) post 방식
(좌) json_c52curl_get.do 웹페이지 / (우) 서버가 받는 값

//리눅스  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(헤더정보 복사함수)를 통해 헤더 정보를 읽어와줘.

(우) 헤더 정보와 서버 응답 내용(json형식으로 보내진 객체 정보)을 확인 할 수 있다. 

 

--예문 코드 보기--

더보기
#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 형식의 데이터 정보를 넣는다.

(좌) URL - 복사 버튼으로 바로 전체 내용을 복사할 수 있다. / (우) 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;
}