기타/C언어: 34개의 글
GNU MAKE 참조문서: http://wiki.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html make는 파일 간의 종속관계를 파악하여 Makefile(기술파일)에 적힌 대로 컴파일러에 명령하여 SHELL명령이 순차적으로 실행 1. make의 장점 단순 반복 작업을 자동화 해준다(일일이 gcc명령어를 안쳐도 됨) 프로그램의 종속 구조를 빠르게 파악 2. makefile 구성 목적파일(Target) : 명령어가 수행되어 나온 결과를 저장할 파일 의존성(Dependency) : 목적파일을 만들기 위해 필요한 재료 명령어(Command) : 실행 되어야 할 명령어들 매크로(macro) : 중복되는 이름들을 특정 단어로 치환(C의 #define)으로 코드를 단순화 3. ma..
1. 소켓의 옵션 아래는 프로토콜 레벨과 옵션 이름들이다. 1-1. SOL_SOCKET : 일반적인 옵션 SO_SNDBUF : 송신버퍼 크기 설정 SO_RCVBUF : 수신버퍼 크기 설정 SO_REUSEADDR : 지역 주소(IP,Port) 재사용여부 SO_KEEPALIVE : 주기적으로 연결 여부 확인 SO_BROADCAST : 브로드캐스팅 허용여부 SO_DONTROUTE : 라우팅 테이블 참조과정 생략여부 SO_OOBINLINE SO_ERROR SO_TYPE : 소켓의 타입(변경 불가) 1-2. IPPROTO_IP : IP 패킷 관련 IP_TOS : Type of Service 변경 IP_TTL : Time-To-Live 변경 IP_MULTICAST_TTL : 멀티캐스트 패킷의 TTL 변경 IP_MU..
1. hostent 구조체 struct hostent { char *h_name; //공식 도메인 이름 char **h_aliases; //공식 이외 도메인 이름들 int h_addrtype; //주소정보 체계(IPv4: AF_INET, IPv6: AF_INET6) int h_length; //IP주소의 크기를 담는다. (IPv4는 4) char **h_addr_list; //도메인 이름에 대한 IP주소가 정수 형태로 반환될 때 이 멤버 변수를 이용 } * 예제 2. 도메인 관련 API #include 아래 함수들을 호출하면 소켓 라이브러리가 DNS서버에 조회하여 IP주소나 도메인명을 찾는 기능을 제공한다. 이와같은 정보를 hostent 구조체에 담아서 반환해주는 것이다. 개발자가 IP주소를 알아내기위해..
1. Half-close란? 1-1. 일방적인 close()의 문제점 A호스트와 B호스트가 서로 TCP통신하고 있다. 그러나 A호스트가 일방적으로 close()로 연결을 종료하면 B호스트는 A호스트로 데이터를 보낼게 있어도 보낼 수 없다. 따라서 일방적으로 송수신 스트림을 끊어버리는 건 문제가 있으므로, 하나의 스트림(주로 송신을 닫고, 수신을 열어둠)만 닫는 것을 Half-close 기법이라고 한다. 1-2. Half-close가 필요한 이유 서버는 단순히 데이터를 연속해서 전송하면 되지만, 클라이언트는 언제까지 데이터를 수신해야 하는지 알 수 없다. 주기적으로 read()함수를 호출하다가는 블로킹(호출된함수가 반환되지 않음) 상태에 빠질 수도 있다. 그러므로, 데이터전송이 끝났음을 알리는 EOF를 날..
TCP소켓에 이어서 쓴다 1. UDP소켓이란? UDP소켓은 비연결지향형 소켓이다. TCP에 있는 흐름제어가 없다. 특징으로는 전송순서에 상관없이 가장 빠른 전송,경로를 지향한다. 데이터 손실의 우려가 있고 한번에 전송할 수 있는 데이터의 크기가 제한된다. 데이터의 경계가 존재한다. TCP소켓과 반대라고 생각하면 쉽다. 데이터의 경계가 존재한다는 건, 3번 write()했으면 3번 read()를 해서 수신해야한다는 것이다. 이러한 특징때문에 UDP는 주로 고속의 데이터 전송이나 데이터가 조금 손실되도 상관없는 곳에 쓰인다. 대표적인 예가 동영상 스트리밍을 들 수 있겠다. 중학교 때 스타좀 (많이)해봤는데.. 스타크1을 한사람이면 특히 UDP란 글자가 익숙할거다. 게임플레이어간에 고속통신을 위하여 UDP로 ..
입력과 출력은 프로그램의 흐름이다. 입력을 키보드뿐만아니라 파일로도 할 수 있으며, 출력에도 모니터뿐만 아니라 파일역시 출력의 대상이다. 1. 표준 스트림 특정한 프로그래밍 언어 인터페이스뿐 아니라 유닉스 및 리눅스,윈도 등에서 컴퓨터 프로그램과 그 환경 사이에 미리 연결된 입출력 통로이다. 스트림은 단방향이다. 데이터 스트림은 순차적인 데이터 바이트들을 파일의 끝(EOF)까지 읽는다. 이런 방식으로, 프로그램은 쓸 데이터가 얼만큼 남았는지, 혹은 어떤 식으로 묶여있는지 알 필요 없이 필요한 데이터를 쓸 수 있었다. c언어에서 함수앞에 f가 붙은 함수들은 보통 인자로 FILE *stream을 받는다. 2. 표준입력 입력을 위한 스트림(Standard input, STDIN, 0) 변수는 FILE* std..
구조체의 메모리 저장방식을 알면 멤버변수들을 선언할때 좀 더 메모리를 효율적, 최적화되게 쓸 수 있다. 1. 구조체의 바이트 패딩 바이트패딩이란 멤버 변수를 메모리에서 CPU로 읽을 때 한번에 읽을 수 있도록, 컴파일러가 레지스터의 블록에 맞춰 바이트를 패딩해주는 최적화 작업이다. 만약 컴파일러가 패딩을 하지 않는다면(=최적화를 해주지 않는다면) CPU가 메모리에 다시 접근하면서 성능이 떨어질 것이다. struct x { char a; int b; char c; }; struct x data; 위 구조체를 sizeof(data) 로 찍어보면 6이 나올 것같지만 12가 나온다. 컴파일러는 구조체를 구성하는 멤버들을 가장 크기가 큰 멤버 자료형의 배수가 되도록 정렬한다. 이 정렬을 위해 의미없는 바이트(패딩..
TCP소켓 프로그래밍의 기초 0. 다루는 소켓에 대하여 일반적으로 사용되는 INET(TCP/IP 를 이용한 인터넷 주소 패밀리)와 TCP(데이터 연결지향형, 신뢰성이 높은 Stream) 에 대해서 다룬다. 리눅스(centos7) 환경을 기준으로 다룬다. 이번에도 느낀건데 이런식으로 넘버링하면서 공부하면 뇌에 효율적으로 저장되는거같다.. 1. 소켓이란? 직관적인 예로 전구는 소켓을 이용하여 전기를 공급받는다. 이처럼 컴퓨터도 네트워크에서 데이터를 얻기위해 소켓을 사용할 수 있다. 소켓 프로그램은 서버-클라이언트의 2개의 프로그램으로 쌍을 이룬다. 서버는 서비스를 제공하는 프로그램이고, 클라이언트는 서버에 서비스를 요청하는 프로그램이다. TCP 소켓이란? TCP소켓은 연결지향형이다. 중간에 데이터가 소멸되지..
[C] 퀵정렬 예제 정리 퀵 정렬은 아주 빠른 속도를 나타낼뿐만 아니라 원리도 간단해서 많은 응용 분야에서 사용되고 있다. 퀵 정렬은 연속적인 분할에 의해서 정렬한다.축(Pivot)값을 중심으로 왼쪽은 이 축값보다 작은 값으로 오른쪽은 모두 이 축값보다 큰 값을 배열시키는 것이다.이렇게 하여 축값의 왼쪽과 오른쪽 부분을 각각 또다시 분할하고 하는 과정을 분할의 크기가 1이 될 때까지 반복하면 전체적으로는 정렬이 완료된다. 알고리즘1. 만약 n>1 이면1.1 N 크기의 a 배열을 분할 하여 축값의 위치를 mid로 넘긴다.1.2 퀵 정렬 알고리즘(a, mid)1.3 퀵 정렬 알고리즘 (a+mid-1, N-mid-1) 퀵 정렬은 안정성이 없다. void quick_sort(int a[], int n){ int..
[C] 분포수 세기 정렬 예제 분포수세기는 아주 간단한 알고리즘으로 같은 키가 많이 있는 배열에 한해 적용할 수 있는 정렬 알고리즘이다.분포수세기는 특정 키 값이 출현하는 빈도를 저장하여 누적분포를 이용하여 간단하게 정렬하는 방법이다. 분포수세기 알고리즘은 안정성이 있다. 그러기 위해서 배열의 뒤에서부터 앞으로 값을 꺼내온다. #include #include void dist_count(int a[], int n, int m){ int i; int *b, *count; b = (int*)malloc(sizeof(int)*n); count = (int*)malloc(sizeof(int)*(m + 1)); for (i = 0; i