| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- Photon
- team project
- multi-thread
- Network Programming
- PS
- design pattern
- Data Structure
- BOJ
- System Programming
- c#
- 독서
- C++
- Online Judge
- Unity
- Toy Project
- git
- Today
- Total
목록전체 글 (370)
I'm FanJae.
1. 시작에 앞서- 이전에는 동기/비동기와 Blocking/Non-Blocking의 차이를 정리하면서, 서버가 클라이언트의 요청을 기다리는 동안 스레드가 계속 묶이는 구조가 어떤 한계를 가지는지 살펴봤다.- 개념을 정리한 다음에는 이를 실제 서버 코드에 적용해볼 필요가 있었다.- 이번 작업에서는 Windows에서 제공하는 IOCP(I/O Completion Port)를 이용해 클라이언트의 접속과 데이터 수신을 비동기로 처리하기 위한 기본 네트워크 구조를 구현했다.- 단순히 IOCP 객체만 생성하는 것이 아니다.- 클라이언트 접속을 AcceptEx로 비동기 처리- 접속이 완료되면 Session이 소켓의 소유권을 넘겨 받음.- 해당 Session의 Socket을 IOCP에 등록- WSARecv를 통해 데이터..
1. 시작에 앞서- 이전에는 동기와 비동기, Blocking과 Non-Blocking의 차이에 대해 정리했다.- 그중 Blocking 방식에서는 recv()와 같은 I/O 함수를 호출했을 때 작업을 바로 완료할 수 없다면 해당 작업이 완료될 때까지 호출한 Thread가 대기하게 된다.Threadrecv() │ │ 데이터 대기 │ │ ▼데이터 수신 │ ▼return- 구현 자체는 단순하다. 실행 흐름도 직관적이기 때문에 연결 수가 많지 않은 프로그램이라면 Blocking 방식만으로도 충분할 수 있다.- 하지만 서버에서 동시에 처리해야 하는 클라이언트가 증가하기 시작하면 이야기가 달라진다.- 이번에는 Blocking 방식으로 여러 클라이언트를 처리하려고 할 때 어떤 문제가 발생하는지 정리해보려고..
1. 시작에 앞서- 네트워크 서버를 구현하다 보면 동기(Synchronous), 비동기(Asynchronous), Blocking, Non-Blocking이라는 용어를 자주 접하게 된다.- 처음에는 단순히, 동기는 작업을 기다리는 방식이며, 비동기는 작업을 기다리지 않는 방식 정도로 생각하기 쉽다.- 하지만 실제로 네트워크 프로그래밍을 시작하면 Blocking Socket, Non-Blocking Socket, Asynchronous I/O, Overlapped I/O, IOCP 등의 개념이 등장하면서 이 구분만으로는 설명하기 어려워진다.- 특히, 동기/비동기와 Blocking/Non-Blocking은 서로 완전히 동일한 기준으로 구분하는 개념이 아니다.- 따라서 IOCP를 본격적으로 정리하기 전에 먼저..
1. 시작에 앞서- 이전에는 로그인 서버와 게임 서버를 분리해야 하는 이유에 대해 고민했다.- 인증과 실제 게임 로직은 처리하는 작업의 성격이 다르고, 역할과 보안 경계를 분리한다는 측면에서도 두 서버를 나눠서 생각할 수 있다고 판단했다.- 하지만 서버를 분리하면서 새로운 문제가 하나 생겼다. 로그인 서버에서 인증된 사용자를 게임 서버에서는 어떻게 인증된 사용자라고 판단할 것인가?- 로그인 서버와 게임 서버가 하나의 프로세스라면 인증 결과를 내부 상태로 그대로 유지할 수도 있다.- 하지만 두 서버가 별도의 프로세스로 동작한다면, 로그인 서버가 가지고 있는 인증 상태를 게임 서버까지 전달할 방법이 필요하다.2. 인증 상태를 이어주기 위한 정보가 필요하다.- 이를 위해 로그인 성공 시 별도의 인증 정보를 발..
1. 시작에 앞서- 프로젝트의 범위를 어느 정도 정한 뒤 가장 먼저 고민했던 것은 서버를 어떤 구조로 구성할 것인가였다.- 즉, 로그인 서버와 실제 게임 처리를 하는 서버를 처음부터 분리해야 하는가?에 대한 고민이었다.2. 로그인 서버와 게임 서버에 대하여- 온라인 게임의 서버 구조를 찾아보면, 로그인, 인증, 게임 세션을 각각 별도의 서버 또는 서비스로 분리해서 구성하는 경우가 많다.- 따라서 이를 분리해서 생각하는 것이 필요하다고 생각했다.- 다만, 실제 게임에서 사용한다는 이유만으로 서버를 나누기 보다 왜 서버를 나누는지 이해할 필요도 있었다.3. 로그인 서버와 게임 서버의 역할- 두 서버를 단순하게 나눠서 생각해보면, 다음과 같이 생각할 수 있다.- 로그인 서버는 계정의 인증이나 로그인 상태의 확..