전체 글 289

Book review | 사피엔스

진짜 완독하는데 오래걸렸다. 드디어 리뷰를 쓰네 ㅠ.ㅠ 책의 분량이 많기도 하지만, 요즘 집에 평온하게 앉아 책 읽을 시간이 많지 않아 출퇴근 시간에만 읽다보니.. 1달 정도 걸린듯 하다. 라는 책 자체는 워낙 유명한 베스트셀러 라서.. 책을 즐겨 읽는 사람들 대부분이 '언제간 꼭 읽어봐야지' 하는 책이 아닐까 싶다. 나도 그런 물결에 동참하여(?) 처음 이 책을 손에 들었지.. 실은 과학 분야에 크게 관심이 없었다. 물론 지금도 없다(!) "관심 분야도 아니고 두껍기만 한 이 책을 끝까지 읽고 리뷰까지 쓰냐?" 라고 묻는다면 '그럼에도 불구하고' 흥미로운 책이기 때문이다. 이 책의 주제는 명확하다. 저자가 서문에 쓴 내용을 빌리자면, 나는 이 책이 독자 스스로 '우리는 누구인가, 어디에서 왔는가, 어떻..

입출력 다중화 (I/O Multiplexing)

이번에 배울 개념은 입출력 다중화, I/O Multiplexing 이다. 멀티플렉싱의 사전적 의미를 보면, "하나의 통신채널을 통해서 둘 이상의 데이터(시그널)을 전송하는데 사용되는 기술" 이다. 다시 말하자면, 효율성을 높히기 위해 물리적인 장치를 최소한으로 사용하여 최대한의 데이터를 전송하는 기술이다. 이 개념을 네트워크 소켓에 적용 시키면, 다수의 프로세스를 생성하지 않고도 여러 개의 클라이언트에게 서비스를 제공할 수 있는 기술이 되겠다. 프로세스를 생성하는 데에는 상당히 많은 작업이 요구된다. 많은 양의 연산작업, 잡아먹는 메모리 공간 등등.. 그리고 프로세스 간의 통신 (IPC)도 솔직히 복잡하다. 그래서 I/O 멀티플렉싱이 의미를 가진다. 기존의 I/O 모델들을 살펴보고 멀티플렉싱에 대해 자세..

시그널 핸들링(SIGCHLD)

TCP echo server, client에 대해 봤다. 그럼 이 프로그램의 정상적인 시작과 종료에 대해 알아보자. 처음에 클라이언트가 연결 요청을 하지 않았을 때, 서버는 listen 상태 일 것이다. netstat -a 명령을 통해 local ip :*, local port : 9877 로 listen 상태인 것을 확인할 수 있다. 그럼 이제 클라이언트 요청에 의해 서버가 연결된 모습을 보자. 보다 시피 연결이 되었을 때는 ESTABLISHED 상태가 되어 있다. 서버의 자식 소켓과 클라이언트 소켓이 ESTABLISHED 상태가 되어 있고, 서버의 부모 소켓은 여전히 Listen 상태가 되어 있다. 그럼 이번에 정상종료 하는 것을 보자. 서버의 자식 소켓의 연결이 끊어지면 부모 소켓으로 SIGCHLD..

TCP echo Server/Client

이번부터 지금까지 배운 TCP 소켓 함수들을 이용하여 TCP 서버-클라이언트 예제를 한번 구현해보겠음. echo(메아리) 서버, 클라이언트를 한번 만들어보자. main 함수의 for문 전까지는 그냥 소켓을 생성하고 바인딩한 후 listen 상태도 만드는 기본적인 소켓 셋팅 코드임. 그리고 for문에 들어오면 연결 소켓을 connfd에 저장하고 fork로 자식 프로세스를 생성한다. fork 반환값이 0이면 자식프로세스 분기인데, 자식은 listen 소켓을 닫고 연결 소켓을 연다. str_echo 라고 하는 아래 정의된 함수에 의해서 connfd 가 작업을 함. 원래는 여기 나오는게 concurrent server 즉, 동반 서버에 대한 설명을 했어야 했는데, 따로 빼서 하기도 애매해서 코드와 함께 작성할 ..

소켓 프로그래밍

앞서 소켓이 무엇인지 알아봤고, 이제 소켓으로 실제 통신이 어떻게 구현되는지 알아보자. 클라이언트의 동작에 대한 함수를 알아보고 난 뒤, 서버에 대해 알아보겠다. 일단 먼저, 서버든 클라이언트든 통신에 앞서 socket을 생성해야 할 것이다. ​TCP 통신 전체 그림을 보면서 socket 녀석이 어딨는지 보자. 소켓은 socket 함수를 이용하여 생성한다. 어떤 친구인지 한번 알아보자. 어떤 프로토콜로 통신할 것인지, 어떤 종류의 소켓을 사용할 것인지 미리 정해진 값들을 집어넣기만 하면 된다. domain 부분에서 PF_INET 와 AF_INET 이부분이 좀 혼동할 수 있는데, PF_INET는 프로토콜 체계(프로토콜 패밀리)이고 AF_INET는 주소 체계(주소 패밀리)이다. connect() 소켓을 생성..

반응형