2021-03-17(Wed)

항목

내용

학습 날짜

2021-03-17(수)

학습 시간

11:00~24:00

학습 범위 및 주제

socket, bind, listen, select, accept

학습 목표

exam06을 통과할 수 있도록 학습한다.

동료 학습 방법

-

상세 학습 내용

서브젝트는 끝냈지만, 바로 이어서 학습 시작했다. exam06에서 요구하는 IRC 간이 서버를 바로 구현할 수 있도록 연습했다.

일반적으로 웹서버는 아래 플로우를 따라간다.

  1. socket을 만든다. TCP/IP에서는 SOCK_STREAM을 사용한다.

  2. bind 함수로 socket에 server socket에 필요한 정보(주소, port 번호 등)를 할당하고 커널에 등록한다. 이제 다른 시스템과 통신할 수 있는 상태가 된다.

  3. 이제 listen 함수를 활용하여 socket_fd으로 클라이언트 접속 요청을 확인할 수 있도록 셋팅한다. 한편 클라이언트 측에서 connect로 접속요청을 한다.

  4. 우린 select로 요청을 감지하여 socket_fd에 변화가 있으면 아래 5번을 실행하고, 아니라면 6번을 실행한다.

  5. 클라이언트 접속 요청에 따라 accpet로 접속을 허락한다. 이제 client socket이 만들어졌다.

  6. recv/read를 통해 전송되어 오는 데이터를 읽어들인다. 이후 write/send로 클라이언트에게 데이터를 전송한다.

이 때 exam 요구사항에 따라 어느 한 클라이언트의 메시지를 모든 나머지 클라이언트에게 브로드캐스트하도록 구현하면 된다. 이를 위해 클라이언트 정보를 리스트로 저장하여 브로드캐스트하는데 활용하였다.

학습 내용에 대한 개인적인 총평

42에서는 웹서버 구현과 IRC 구현 중 하나를 선택해서 구현할 수 있다. 그런데 exam06이 IRC 구현과 비슷하다고 하여 익숙치않을거라 긴장했는데, 얼마 전까지 액션케이블로 브로드캐스트하여 챗팅하는 기능을 구현해서인지 별 위화감 없이 구현할 수 있었다. 굿굿

다음 학습 계획

  • exam06 응시

Last updated