. '프로그래밍 공부' 카테고리의 글 목록 (3 Page)
본문 바로가기

프로그래밍 공부65

11.4 소켓 인터페이스 (작성 중) 소켓 인터페이스는 네트워크 응용프로그램을 만들기 위한 Unix I/O 함수들과 함께 사용되는 함수들의 집합이다. 그림 1은 전형적인 소켓 인터페이스의 개요를 보여준다. ※ 이 글에서 [TCP-IP/공부]주소정보의 표현 : 네이버 블로그 (naver.com) 를 참고했다. 아직 고등학생인데 나랑 같이 이거를 하다니. 한국 IT의 미래가 밝다. 11.4.1 소켓 주소 구조체 리눅스 커널의 관점에서 보면 소켓은 통신을 위한 끝점이고, Unix 프로그램의 관점에서 보면 해당 식별자를 가지는 열린 파일이다. /* IP socket address structure */ struct sockaddr_in { uint16_t sin_family; /* Protocol family (always AF_INET) */ u.. 2021. 2. 1.
[C언어, 웹서버] open_clientfd / listen_clientfd 이번 시간에는 그림 1의 왼편에 나타나있는 open_clientfd를 알아보겠다. open_clientfd는 getaddrinfo부터 connect까지 담당해주는 파일이다. 우선 개요는 다음과 같다. #include "csapp.h" int open_clientfd(char *hostname, char *port); Returns: descriptor if OK, −1 on error 이 함수는 호스트명;char hostname 을 사용하는 클라이언트가 서버 포트;char port 와 연결하고, 클라이언트 디스크립터를 반환한다. 함수의 상세 코드는 다음과 같다. int open_clientfd(char *hostname, char *port) { int clientfd; struct addrinfo hi.. 2021. 1. 24.
[C언어, 웹서버] HostInfo #include "csapp.h" int main(int argc, char **argv) { struct addrinfo *p, *listp, hints; char buf[MAXLINE]; int rc, flags; if (argc != 2) { fprintf(stderr, "usage: %s \n", argv[0]); exit(0); } /* Get a list of addrinfo records */ memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET; /* IPv4 only */ hints.ai_socktype = SOCK_STREAM; /* Connections only */ if ((rc = getaddrinfo(argv.. 2021. 1. 24.
[C언어, 웹서버] client 관련 함수 [소켓 프로그래밍 C언어] 기본적인 클라이언트 프로그램 만들기 (리눅스, 유닉스 편 client) 관련 함수 및 소스코드 (tistory.com) [소켓 프로그래밍 C언어] 기본적인 클라이언트 프로그램 만들기 (리눅스, 유닉스 편 client) 관련 안녕하세요! 저번 시간에는 기초적인 서버를 만들어서 제대로 동작하는지 테스트 하는 시간을 가졌었어요.ㅎㅎ 이제 서버가 있으니 오늘은 클라이언트를 만들어서 상호간 통신을 시켜보도록 jhnyang.tistory.com 이번에도 윗 포스팅을 보고 공부하도록 한다. 클라이언트가 서버를 찾기 위해서는 IP주소 뿐 아니라 포트 번호도 필요하다. (포트 번호에 따라 서버가 제공하는 서비스가 달라질 수 있기 때문이다. 컨테이너선이 어항魚港을 찾아가면 어떻게 되겠는가?) 1.. 2021. 1. 24.
[C언어, 웹서버] server 관련 함수 및 소스코드 [소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드 (tistory.com) [소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 안녕하세요~! 오늘은 기본적인 TCP 서버 프로그램을 작성해볼게요. 소켓 프로그래밍으로 간단한 채팅 서버를 만들어볼 생각인데, 찬찬히 진행해보도록 합시다. 소켓 프로그래밍이란? 오늘날 모 jhnyang.tistory.com 책으로만 공부하다가 너무 막혀서 잘 써져있는 블로그를 통해 공부해보기로 했다. 1. socket() #include #include int socket(int domain, int type, int protocol); Returns: non.. 2021. 1. 24.
11.3 글로벌 IP 인터넷 각 인터넷 호스트는 TCP/IP;Transmission Control Protocol / Internet Protocol 라는 프로토콜을 구현한 소프트웨어를 실행하며, 현대 인터넷의 기반이 된다. 인터넷 클라이언트와 서버는 소켓 인터페이스와 Unix I/O 함수들의 혼합을 사용해서 통신한다. 소켓 함수들은 일반적으로 시스템 콜들로 구현되는데, 이 시스템 콜은 커널에서 트랩을 발생시키며, TCP/IP에서 다양한 커널 모드 함수들을 호출한다. 사실 OSI모형에서 TCP는 UDP와 같이 4단계-전송계층, IP는 3단계-네트워크 계층에 속한 별개의 프로토콜이나, 일반적으로 TCP/IP를 묶어서 다루고 UDP는 다루지 않을 것이다. IP 주소 본격적인 IP주소에 들어가기에 앞서, 소켓을 배우다보면 네트워크 바이트.. 2021. 1. 22.
11.1 클라이언트-서버, 11.2 네트워크 11.1 클라이언트-서버 프로그래밍 모델 모든 네트워크 응용 프로그램은 클라이언트-서버 모델에 기초하고 있다. 서버는 일부 리소스를 관리하고, 이 리소스를 조작해서 클라이언트를 위한 서비스를 제공한다. 클라-서버 모델에서 근본적인 연산은 트랜잭션;Transaction 이다. 이 트랜잭션은 4단계로 구분된다. 1. 클라가 서비스를 필요로 할 때, 클라는 요청;Request를 서버에 보내는 것으로 트랜잭션을 시작한다. 2. 서버는 요청을 받고 서버가 행할 수 있는 클라의 요청에 응답할 수 있도록 작업한다. 3. 서버는 응답;Response를 클라로 보낸다. 4. 클라는 응답을 받고 이것을 유저에게 전달할 수 있도록 처리한다. 11.2 네트워크 클라이언트와 서버는 종종 별도의 호스트에서 돌아간다. 가장 기본적.. 2021. 1. 22.
9.9.12 종합 설계 : 간단한 할당기의 구현 (수정중) 이제 본격적인 할당기의 구현이다. 우선 전제 조건은 최대 블록은 2^32 = 4GB이고, 64비트를 전제로 하여 설계를 해보겠다. - 할당기 기본 설계 우선 memlib.c 메모리 시스템 모델을 보고 가자. (memlib.c 패키지게엇 기본적으로 제공되므로 실제로 코드로 구현하지 않아도 된다.) // --------------------- Declaration --------------- // extern int mm_init(void); extern void *mm_malloc (size_t size); extern void mm_free (void *ptr); /* Private global variables */ static char *mem_heap; /* Points to first byte o.. 2021. 1. 17.
9.9.11 경계 태그로 연결하기 할당기는 어떻게 연결을 구현하는가? 우리가 한 블록을 반환했다고 하자. 반환한 그 자리에 헤더가 있기 때문에 다음 가용 블록을 찾는 것은 쉽다. 그러나 바로 앞에 가용 블록이 있는지 없는지는 어떻게 알 것인가? 현재 상태에서는 다시 처음부터 검색을 해서 반환자리까지 올 수 밖에 없다. 그러나 딱 봐도 엄청 비효율적이지 않은가? 그래서 풋터footer(foot + pointer) 라는 경계 태그를 블록의 끝에 넣어준다. 데이터의 내용은 헤더와 동일하다. 그런데 그렇다면 풋터도 4바이트의 용량을 차지하게 되고, 헤더와 풋터를 합치면 8바이트가 된다. 그런데 우리가 4바이트의 정수만을 할당받는다고 가정해보자. 그렇다면 블록의 구성은 헤더(4바이트)+데이터(4바이트)+풋터(4바이트) 의 12바이트의 블록을 할당.. 2021. 1. 16.
9.9.7~11 할당한 블록의 배치/분할/연결 등 9.9.7 할당한 블록의 배치 어플리케이션이 메모리 할당을 요청할 때, 할당기는 요구되는 메모리 만큼의 가용 블록이 있는지를 검색할 것이다. 이 떄, 할당기가 이 검색을 수행하는 방법은 배치 정책에 의해 결정된다. 이 정책에는 first fit, next fit, best fit 이 세가지가 주로 사용된다. 각 정책의 특징은 다음과 같다. First Fit - First fit은 가용 리스트를 처음부터 검색하여 크기가 맞는 첫 번째 가용 블록을 선택한다. - 장점 : 대체로 리스트의 마지막에 가장 큰 가용 블록들을 남겨둔다. - 단점 : 대체로 리스트의 앞에 작은 가용 블록들을 남겨두기 때문에 큰 가용 블록을 검색하는 경우, 작은 블록들을 거쳐서 큰 블록으로 가야되기 때문에 시간이 늘어난다. (크든 작든.. 2021. 1. 16.
9.9.4 단편화 / 9.9.5 구현 이슈 / 9.9.6 묵시적 가용 리스트 단편화(Fragmentation)는 할당 요청을 수행할 수 없는 조건일 때 일어난다. 단편화는 내부 단편화와 외부 단편화로 나뉜다. 내부 단편화 내부 단편화는 할당된 블록이 데이터 자체보다 더 클 때 일어난다. 예를 들어 아래의 그림을 보자 그림 1은 64bit에서의 할당 예시이다. 그림의 한칸은 4바이트를 의미한다. 정수는 4바이트이기 때문에 5*sizeof(int)는 5칸을 차지하지만, 64비트에서는 8바이트씩 (2칸씩)만 배치할 수 있기때문에 2의 배수로 할당해서 6칸을 차지하게된다. 즉, 4바이트가 낭비되고 있는 것이다. (왜 이런지에 대해서는 이전 게시글 (9.9.1 malloc과 free함수 (tistory.com)) 에서 논의한적이 있다.) 이렇게 할당된 블록이 실제로 요구하는 데이터의 크기.. 2021. 1. 15.
9.9.2 왜 동적 메모리 할당인가? / 9.9.3 할당기 요구사항과 목표 우선 정수를 하나씩 입력받는 함수를 만들어보자. 1 #include "csapp.h" 2 #define MAXN 15213 3 4 int array[MAXN]; 5 6 int main() 7 { 8 int i, n; 9 10 scanf("%d", &n); 11 if (n > MAXN) 12 app_error("Input file too big"); 13 for (i = 0; i < n; i++) 14 scanf("%d", &array[i]); 15 exit(0); 16 } 이 함수는 시작할 떄, 15213칸의 array를 선언한다. 만약 정수를 10개만 입력하고 싶다면 15203칸이 낭비될 것이고, 15214개의 정수를 입력하고 싶다면 성립되지 않는다. /* 이것이 stack메모리 인가? */ 그렇기에 .. 2021. 1. 15.
9.9.1 malloc과 free함수 C언어 표준 라이브러리는 malloc 이라는 명시적인 할당기를 많이 쓴다. 이 함수로 힙으로부터 블록들을 할당받는다. 우선 어떤 함수인지 보고가자. #include void *malloc(size_t size); Returns: pointer to allocated block if OK, NULL on error size_t 만큼의 포인터를 반환한다는 뜻이다. 구체적인 예는 아래와 같다. typedef struct _NODE { int cnt; bool leaf; bool root; int key[2 * t - 1]; struct _NODE *child[2 * t]; struct _DATA *dataAdress[2 * t]; struct _NODE *prevPtr; struct _NODE *nextPtr.. 2021. 1. 15.
9.9.0 동적메모리 할당 서문 가상 메모리의 영역을 저수준의 mmap과 munmap의 함수를 사용하여 생성하고 삭제할 수 있다. /* mmap과 munmap은 어떤 함수인가? 기본적이고 간단한 가상메모리 함수인가? mmap은 사용자 수준에서 커널 내부 주소 접근시 사용하고 munmap은 해제할 때 사용한다고 한다. */ 하지만 대개 추가적인 가상메모리를 런타임에 획득할 필요가 있을 때, 동적 메모리 할당기를 사용하는 것이 더 선호된다고 한다. 동적 메모리는 힙heap 이라고 하는 프로세스의 가상메모리 영역을 관리한다. /* 동적 메모리에 들어가기에 앞서 간단히 메모리의 영역을 공부하고 넘어가겠다. 메모리 구조를 알아보자 (velog.io) 메모리 구조를 알아보자 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간(RAM)은 다음과.. 2021. 1. 15.