# 2021-03-17(Wed)

| 항목         | 내용                                   |
| ---------- | ------------------------------------ |
| 학습 날짜      | 2021-03-17(수)                        |
| 학습 시간      | 11:00\~24:00                         |
| 학습 범위 및 주제 | socket, bind, listen, select, accept |
| 학습 목표      | exam06을 통과할 수 있도록 학습한다.              |
| 동료 학습 방법   | -                                    |

## 상세 학습 내용

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

![image](https://user-images.githubusercontent.com/54612343/111901980-6cc08200-8a7e-11eb-95b0-cba5abdc0bb8.png)

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

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

* 참고: <https://badayak.com/4472>

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

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

## 다음 학습 계획

* exam06 응시


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://injun-woo30000.gitbook.io/growth-log/daily-review/2021/march/2021-03-17-wed.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
