Linux์์ C๋ก ๊ตฌํ๋ ํฐ๋ฏธ๋ ๊ธฐ๋ฐ ๋ฉํฐํ๋ ์ด์ด ์ฒด์ค ๊ฒ์์ ๋๋ค. ์ปดํ์ผํ๋ ๋์ ๊ฐ๋ฒผ์ด ์ฒด์ค ๊ฒ์์ ์ฆ๊ธฐ๊ณ ์ถ์ ๊ฐ๋ฐ์๋ฅผ ์ํด ์ค๊ณ๋์์ต๋๋ค โ GUI ์ค๋ฒํค๋ ์์ด ์์ํ CLI์ ๋งค๋ ฅ์ ๊ฒฝํํ์ธ์!
- ์ ์ฒด ์ฝ๋ ๋ผ์ธ ์(C์ธ์ด): 6,108๋ผ์ธ
- ํด๋ผ์ด์ธํธ 3,345๋ผ์ธ, ์๋ฒ 1,300๋ผ์ธ, ๊ณตํต ์ฝ๋ 773๋ผ์ธ
![]() |
![]() |
![]() |
|---|---|---|
| ๊ถ์์ค | ๊น๋ฌธ๊ธฐ | ํฉ๋ถ์ฐ |
| 24์ธ์ปด ์ฒด์ค ๋ฃฐ, ๊ธฐ๋ฌผ ์ ์, PGN ํ์ ๋ฑ ๊ตฌํ |
24๊ธ์ UI ๊ตฌํ, ๋ฆฌํ๋ ์ด ๊ตฌํ |
24๊ธ์ PM, ํ๋ก์ ํธ ์ธํ , UI/์๋ฒ/ํต์ ๊ตฌํ |
- ๋๋ค์๋ง ์ ๋ ฅํด ๊ฐํธ ์ ์
- ์ค์ ์๋ฒ ๊ธฐ๋ฐ ์๋ ๋งค์นญ
- TUI ๊ธฐ๋ฐ ์ฒด์ค UI (์ฒด์คํ, ๊ธฐ๋ฌผ, ๋ฉ๋ด ๋ฑ)
- ์ฒด์ค ๊ท์น ์์ ๊ตฌํ (์บ์ฌ๋ง, ํ๋ก๋ชจ์ , ์ํ์, 3์ ๋ํ ๋ฑ)
- PGN ํฌ๋งท์ผ๋ก ๊ธฐ๋ณด ์ ์ฅ ๋ฐ ๋ฆฌํ๋ ์ด
- ํด๋ผ์ด์ธํธ โ ์๋ฒ ์ค์๊ฐ ๋๊ธฐํ
- ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ
- ์ ํ ์๊ฐ ๋๊ธฐํ (ํ์ด๋จธ)
- ๋ง์ฐ์ค ํด๋ฆญ์ ํตํ ์ฒด์คํ ์กฐ์ ์ง์ (ncurses ํ์ฉ)
์ฒด์คํ์์ ์ฎ๊ธธ ๊ธฐ๋ฌผ์ ํด๋ฆญํ ํ, ์ฎ๊ธธ ์์น๋ฅผ ํด๋ฆญํ์ฌ ์์ง์ผ ์ ์์ต๋๋ค.
- ๋ฆฌํ๋ ์ด๋ ๊ฒ์ ์ข
๋ฃ ์ ์๋์ผ๋ก ํ์ฌ ์์
๋๋ ํ ๋ฆฌ์
replaysํด๋์ ์ ์ฅ๋ฉ๋๋ค. - ๋ฆฌํ๋ ์ด ํ์ผ์ ํ์ฅ์๊ฐ
.pgn์ธ ํ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. - ํด๋ผ์ด์ธํธ ์คํ ํ
2. Replay๋ฉ๋ด๋ฅผ ํตํด ๋ฆฌํ๋ ์ด ํ์ผ์ ํ์ธํ ์ ์์ต๋๋ค. - ํ์ดํ ํค ๋๋ ์ํฐํค๋ก ์์ ์ ์ด๋ํ ์ ์์ผ๋ฉฐ Space ํค๋ก ์๋ ์ฌ์/์ ์ง๋ฅผ ํ ์ ์์ต๋๋ค.
replays/sample.pgnํ์ผ์ ์ํ PGN ํ์ผ์ด ์์ต๋๋ค. ๋ฆฌํ๋ ์ด ๊ธฐ๋ฅ์ ํ ์คํธํด๋ณด์ธ์!
ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ํํํ ๋ค์ด์ด๊ทธ๋จ ์ด๋ฏธ์ง์ ๋๋ค.
| Area | Technologies & Tools |
|---|---|
| Language | C |
| Networking | Socket API (socket, bind, listen, accept, select) |
| Multithreading | pthread, mutex |
| UI | ncurses, ASCII escape codes |
| Data Format | protobuf-c |
| Game Records | PGN (Portable Game Notation) |
| Build & Deploy | CMake, Docker, GitHub Actions |
- ์ด์์ฒด์ : Linux (Ubuntu 24.04)
- ์ปดํ์ผ๋ฌ: gcc
- ๋น๋ ๋๊ตฌ: CMake
- ํ์ ๋๊ตฌ: GitHub, GitHub Actions (CI/CD)
์ด ํ๋ก์ ํธ๋ ํด๋ผ์ด์ธํธ, ์๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ณตํต ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ฉฐ, CMake๋ฅผ ํตํด ๋น๋ ์์คํ ์ ๊ตฌ์ฑํฉ๋๋ค.
multiplay-chess/
โ
โโโ CMakeLists.txt # ์ต์์ CMake ์ค์
โโโ build.sh # ๋น๋ ์คํฌ๋ฆฝํธ
โโโ README.md
โ
โโโ common/ # ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ์ฝ๋
โ โโโ CMakeLists.txt
โ โโโ ... (common source/headers)
โ
โโโ client/ # ํด๋ผ์ด์ธํธ ์ ์ฉ ์ฝ๋
โ โโโ CMakeLists.txt
โ โโโ ... (client source/headers)
โ
โโโ server/ # ์๋ฒ ์ ์ฉ ์ฝ๋
โโโ CMakeLists.txt
โโโ ... (server source/headers)
- ๊ณตํต ์ฝ๋๋
common/์ ๋๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋น๋ํด์ ํด๋ผ์ด์ธํธ/์๋ฒ์์ ๋งํฌํฉ๋๋ค. - ํด๋ผ์ด์ธํธ/์๋ฒ๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ์คํ ํ์ผ๋ก ๋น๋ ๊ฐ๋ฅํฉ๋๋ค
-
Cmake ์ค์น ํ์
sudo apt install cmake
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ํ์
sudo apt install build-essential pkg-config protobuf-compiler protobuf-c-compiler libprotobuf-dev libprotobuf-c-dev libncurses-dev
์๋์ ๊ฐ์ด make ๋ช ๋ น์ด ๋๋ build.sh ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ํ ์ ์์ต๋๋ค.
-
์ ์ฒด ๋น๋ (client, server ๋ชจ๋):
make # ๋๋ ./build.sh -
ํด๋ผ์ด์ธํธ๋ง ๋น๋:
make client # ๋๋ ./build.sh client -
์๋ฒ๋ง ๋น๋:
make server # ๋๋ ./build.sh server -
๋น๋ ํ์ผ ์ญ์
make clean # ๋๋ rm -rf build/
๋น๋๊ฐ ์๋ฃ๋๋ฉด build/client/client, build/server/server์ ์คํ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
-
ํด๋ผ์ด์ธํธ ์คํ:
./run.sh client # ๋๋ ./build/client/client -
์๋ฒ ์คํ:
./run.sh server # ๋๋ ./build/server/server
ํด๋ผ์ด์ธํธ/์๋ฒ ๊ธฐ๋ณธ ํฌํธ๋ 8080์
๋๋ค. ํฌํธ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ช
๋ นํ ์ธ์ -p๋ฅผ ์ฌ์ฉํ์ธ์.
- ํด๋ผ์ด์ธํธ ์คํ (8081 ํฌํธ) ์์:
./run.sh client -p 8081
- ์๋ฒ ์คํ (8081 ํฌํธ) ์์:
./run.sh server -p 8081
ํด๋ผ์ด์ธํธ์ ๊ฒฝ์ฐ, ๊ฒ์์๋ฒ์ ํธ์คํธ๋ช
(IP์ฃผ์, ๋๋ฉ์ธ ์ด๋ฆ ๋ฑ)๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ localhost(127.0.0.1)์
๋๋ค. ํธ์คํธ๋ช
์ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ช
๋ นํ ์ธ์ -h๋ฅผ ์ฌ์ฉํ์ธ์.
- ํด๋ผ์ด์ธํธ ์คํ (8081 ํฌํธ, 192.168.0.100 ํธ์คํธ) ์์:
./run.sh client -p 8081 -h 192.168.0.100
- ํด๋ผ์ด์ธํธ ๋ก๊ทธ:
logs/chess_client_[PID].log(PID๋ณ๋ก ํ์ผ ์ถ๋ ฅ) - ์๋ฒ ๋ก๊ทธ: ์ฝ์์ ์์๊ณผ ํจ๊ป ์ง์ ์ถ๋ ฅ
DEBUG: ์์ธํ ๋๋ฒ๊ทธ ์ ๋ณดINFO: ์ผ๋ฐ ์ ๋ณด ๋ฉ์์งWARN: ๊ฒฝ๊ณ ๋ฉ์์งERROR: ์ค๋ฅ ๋ฉ์์งFATAL: ์ฌ๊ฐํ ์ค๋ฅ ๋ฉ์์ง
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ๋ ์คํ ์ ๋ก๊ทธ๋ฅผ logs/ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํฉ๋๋ค.
watch_logs.sh ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ ๋ก๊ทธ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
./watch_logs.sh-
ํด๋ผ์ด์ธํธ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง (๊ถ์ฅ):
# ๋ชจ๋ ํด๋ผ์ด์ธํธ ๋ก๊ทธ๋ฅผ ์์๊ณผ ํจ๊ป ํ์ ./watch_logs.sh # ๋จ์ผ ๋ก๊ทธ ํ์ผ๋ง ๋ชจ๋ํฐ๋ง ./watch_logs.sh --single # ์๋ฌ/๊ฒฝ๊ณ ๋ง ๋ณด๊ธฐ ./watch_logs.sh --error # ERROR, FATAL๋ง ./watch_logs.sh --warn # WARN ์ด์ ./watch_logs.sh --info # INFO ์ด์ # ๋์๋ง ๋ณด๊ธฐ ./watch_logs.sh --help
Protocol Buffers(protobuf)๋ Google์์ ๊ฐ๋ฐํ ๋ฐ์ดํฐ ์ง๋ ฌํ ํ์์ ๋๋ค. ์ด ํ๋ก์ ํธ์์๋ protobuf-c๋ฅผ ์ฌ์ฉํ์ฌ C ์ธ์ด๋ก ๊ตฌํ๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ์ ํต์ ๋ฉ์์ง๋ฅผ ์ ์ํ๊ณ ์ง๋ ฌํํฉ๋๋ค.
- ํจ์จ์ ์ธ ์ง๋ ฌํ: JSON์ด๋ XML๋ณด๋ค ๋ ์์ ํฌ๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ ์ ์์ต๋๋ค.
- ํ์ ์์ ์ฑ: ์ปดํ์ผ ์์ ์ ๋ฉ์์ง ๊ตฌ์กฐ๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
- ์ธ์ด ๋ ๋ฆฝ์ฑ: ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- ์๋ ์ฝ๋ ์์ฑ: .proto ํ์ผ๋ก๋ถํฐ C ์ฝ๋๋ฅผ ์๋ ์์ฑํฉ๋๋ค.
๋ฉ์์ง ์คํ ์ ์ ๋ณด๊ธฐ
common/proto/:.protoํ์ผ ์์นcommon/generated/:protoc-c๋ก ์์ฑ๋ C ์์ค/ํค๋ ํ์ผ ์์น
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ๋ฉ์์ง ์คํ์ common/proto/message.proto ํ์ผ์ ์ ์๋์ด ์์ต๋๋ค. ์ด ํ์ผ์ ์์ ํ์ฌ ์๋ก์ด ๋ฉ์์ง ํ์
์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ protobuf ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์:
- protobuf ๋ฉ์์ง ์ ์๋ฅผ
common/proto/message.proto์ ์ถ๊ฐ - ์๋ ๋ช ๋ น์ด๋ก C ํ์ผ ์์ฑ
protoc-c -I common/proto --c_out=common/generated/ common/proto/message.proto๋๋ ๋น๋ ์คํฌ๋ฆฝํธ(./build.sh)๋ฅผ ์คํํ๋ฉด ์๋์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค.




