๋ฒ์ : 1.0
์์ฑ์ผ: 2025๋
6์ 16์ผ
๋ณธ ํ๋ก์ ํธ๋ TCP/IP ์์ผ ํต์ ๊ธฐ๋ฐ์ ๋ค์ค ์ฌ์ฉ์ ์ค์๊ฐ ๊ทธ๋ฆผ ํด์ฆ ๊ฒ์์
๋๋ค.
์๋ฒ์ ํด๋ผ์ด์ธํธ๋ C์ธ์ด๋ก ๊ฐ๊ฐ ๊ตฌํ๋์์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ SDL2 ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ง๊ด์ ์ธ GUI๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ก ์ด ํ๋ก์ ํธ๋ ์์ผ ํ๋ก๊ทธ๋๋ฐ, ๋์์ฑ ์ฒ๋ฆฌ, ์ปค์คํ ํ๋กํ ์ฝ ์ค๊ณ๋ฅผ ์ค์ตํ๋ ๋ฐ ๋ชฉ์ ์ด ์์ต๋๋ค.
- ๋จ์ผ ์ค๋ ๋๋ก ์๋ง์ ํด๋ผ์ด์ธํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ๋ฐ ์ฒ๋ฆฌ
select()์์คํ ์ฝ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์ผ๋ง ์ฒ๋ฆฌ- ์ค๋ ๋/ํ๋ก์ธ์ค๋ฅผ ๋จ๋ฐํ์ง ์๊ธฐ์ ์์ ์๋น๊ฐ ์ ๊ณ ์์ ์
- ๋ฉ์ธ ์ค๋ ๋: SDL UI ๋ ๋๋ง ๋ฐ ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ
- ์์ ์ค๋ ๋: ์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง ์์ (UI ๋ธ๋กํน ๋ฐฉ์ง)
- OS: Linux (Ubuntu, CentOS ๋ฑ)
- ์ปดํ์ผ๋ฌ:
gcc - ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
pthreads,libsdl2-dev,libsdl2-ttf-dev
sudo apt-get update
sudo apt-get install build-essential libsdl2-dev libsdl2-ttf-dev
## 4. ๐ฎ ์ฃผ์ ๊ธฐ๋ฅ ์ค๋ช
### 4.1. โ
๋ค์ค ํด๋ผ์ด์ธํธ & ์์ ์ฑ
- ์ต๋ `FD_SETSIZE` (๊ธฐ๋ณธ 1024๋ช
)๊น์ง ์ด๋ก ์ ์ผ๋ก ๋์ ์ ์ ์ง์
- ํด๋ผ์ด์ธํธ์ ๋น์ ์ ์ข
๋ฃ๋ฅผ ๊ฐ์งํ๊ณ , ์์ผ ๋ฐ ์ํ ์ ๋ฆฌ๋ฅผ ์๋ ์ํ
- TCP์ ์คํธ๋ฆผ ํน์ฑ์ ๋ณด์ํ๊ธฐ ์ํด ๊ฐํ ๋ฌธ์(`\n`) ๊ธฐ์ค์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ถ๋ฆฌํ๋ **๋ฉ์์ง ํ๋ ์ด๋ฐ(Message Framing)** ๋ก์ง ๊ตฌํ
### 4.2. ๐ ๋ฐฉ ๊ธฐ๋ฐ ๊ฒ์ ๊ด๋ฆฌ
- ๋ช
๋ น์ด `/create`, `/join`, `/roomlist`, `/exit` ๋ฑ์ ํตํด ๋ฐฉ ์์ฑ ๋ฐ ์
์ฅ
- ์๋ฒ๋ ๊ฐ ๋ฐฉ์ ๊ณ ์ ์ํ(์ ์ ๋ชฉ๋ก, ์ ๋ต, ์ถ์ ์ ๋ฑ)๋ฅผ ์ ์ง ๊ด๋ฆฌ
### 4.3. ๐ฏ ์ถ์ ์ ๊ฒ์ฆ ๋ฐ ํด ์ ์ด
- `drawer_sock` ๊ฐ์ผ๋ก ์ถ์ ์ ์ฌ๋ถ๋ฅผ ํ๋จ
- `DRAW_`, `SET_ANSWER` ๋ช
๋ น์ ์ถ์ ์์ธ์ง ํ์ธ ํ์๋ง ์ฒ๋ฆฌ
- ์ถ์ ์ ์ธ ์ฌ์ฉ์์ ๋ฌด๋จ ์
๋ ฅ ๋ฐฉ์ง
### 4.4. โฐ ์ ํ ์๊ฐ ๊ธฐ๋ฐ ๋ผ์ด๋
- ๊ฐ ๋ผ์ด๋๋ ๊ธฐ๋ณธ 60์ด๋ก ์ ํ
- ์๊ฐ์ด ๋ง๋ฃ๋๋ฉด ์ ๋ต ๊ณต๊ฐ ํ, ๋ค์ ์ถ์ ์๋ก ํด ์๋ ์ ํ
### 4.5. ๐ ๋ฌธ์ ์ํ ๋ฐ ์ ๋ต ์ฒ๋ฆฌ
- `word_list`๋ฅผ ํตํด ์ค๋ณต ์๋ ๋จ์ด ์ถ์
- ์ ๋ต์๊ฐ ๋ฑ์ฅํ๋ฉด ํด๋น ํด๋ผ์ด์ธํธ๋ฅผ ๋ค์ ์ถ์ ์๋ก ์๋ ์ง์
---
## 5. ๐ฌ ์ฌ์ฉ์ ๋ช
๋ น์ด ์์ฝ
| ๋ช
๋ น์ด | ์ธ์ | ์ค๋ช
|
|-----------|------------|----------------------------------------|
| `/nick` | `<๋๋ค์>` | ๋๋ค์ ์ค์ |
| `/create` | `<๋ฐฉ์ด๋ฆ>` | ๋ฐฉ ์์ฑ ํ ์
์ฅ |
| `/join` | `<๋ฐฉID>` | ์ง์ ๋ ๋ฐฉ์ ์
์ฅ |
| `/roomlist` | ์์ | ํ์ฌ ์์ฑ๋ ๋ฐฉ ๋ชฉ๋ก ์กฐํ |
| `/exit` | ์์ | ํ์ฌ ์ฐธ์ฌ ์ค์ธ ๋ฐฉ์์ ๋๊ฐ๊ธฐ |
| `/answer` | `<๋จ์ด>` | (์ถ์ ์ ์ ์ฉ) ํ์ฌ ๋ผ์ด๋์ ์ ๋ต ๋จ์ด ์ค์ |
| `/guess` | `<๋จ์ด>` | (์ฐธ๊ฐ์ ์ ์ฉ) ์ ๋ต ์ถ์ธก |
| `/quit` | ์์ | ํด๋ผ์ด์ธํธ ์ข
๋ฃ |
| *(์์)* | `<๋ฉ์์ง>` | ํ์ฌ ๋ฐฉ ์ฐธ์ฌ์์๊ฒ ์ฑํ
๋ฉ์์ง ์ ์ก |
------------------------------------------------------------------
## 6. ๐ฐ๏ธ ํต์ ํ๋กํ ์ฝ ๋ช
์ธ
### ๐ค ํด๋ผ์ด์ธํธ โ ์๋ฒ
NICK:<nickname>
CREATE_ROOM:<room_name>
JOIN_ROOM:<room_id>
LIST_ROOMS
EXIT_ROOM
SET_ANSWER:<word>
GUESS:<word>
DRAW_POINT:<x>,<y>,<color_idx>,<size>
DRAW_LINE:<x1>,<y1>,<x2>,<y2>,<color_idx>,<size>
DRAW_CLEAR
MSG:<chat_message>
QUIT
### ๐ฅ ์๋ฒ โ ํด๋ผ์ด์ธํธ
SMSG:<server_message> // ์์คํ
๋ฉ์์ง
ROOM_EVENT:<event_message> // ๋ฐฉ ๋ด ์ด๋ฒคํธ (์
์ฅ, ํด์ฅ ๋ฑ)
MSG:[nickname] <chat_message> // ์ผ๋ฐ ์ฑํ
๋ฉ์์ง
TURN_CHANGED:<drawer_nickname> // ์ถ์ ์ ๋ณ๊ฒฝ ์๋ฆผ
DRAW_POINT:... / DRAW_LINE:... // ๊ทธ๋ฆผํ ๊ทธ๋ฆฌ๊ธฐ ๋ฐ์ดํฐ