์ด ํ๋ก์ ํธ๋ RFC 2812 IRC ํ๋กํ ์ฝ ํ์ค์ ์ค์ํ์ฌ ๊ตฌํ๋ ์ค์๊ฐ ์ฑํ ์๋ฒ์ ๋๋ค. kqueue ๊ธฐ๋ฐ ์ด๋ฒคํธ ๋๋ฆฌ๋ธ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๋์์ฑ๊ณผ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ค์ IRC ํด๋ผ์ด์ธํธ(irssi, HexChat ๋ฑ)์ ์๋ฒฝํ ํธํ์ฑ์ ์ง์ํฉ๋๋ค.
- 3๋จ๊ณ ์ธ์ฆ ํ๋ก์ธ์ค: NICK, USER, PASS ์์ ๋ฌด๊ด ์ฒ๋ฆฌ
- ์ค๋ณต ๋๋ค์ ๊ฒ์ฆ ๋ฐ ์ค์๊ฐ ์ถฉ๋ ๋ฐฉ์ง
- ํจ์ค์๋ ๊ธฐ๋ฐ ์๋ฒ ์ ๊ทผ ์ ์ด
- ์ฑ๋ ์์ฑ/์ญ์ ๋ฐ ์ค์๊ฐ ์ฐธ์ฌ์ ๊ด๋ฆฌ
- ์ด์์ ๊ถํ ์์คํ (op/deop ๋ช ๋ น์ด)
- ์ฑ๋ ๋ชจ๋ ์ ์ด: invite-only, key, limit ๋ฑ
- ๊ฐ์ธ ๋ฉ์์ง(DM) ๋ฐ ๊ทธ๋ฃน ์ฑํ ์ง์
- kqueue ๊ธฐ๋ฐ I/O ๋ฉํฐํ๋ ์ฑ์ผ๋ก ์๋ฐฑ ๋ช ๋์ ์ ์ ์ง์
- Non-blocking ์์ผ ํต์ ์ผ๋ก ์๋ต์ฑ ๊ทน๋ํ
- ์ด๋ฒคํธ ๋๋ฆฌ๋ธ ์ํคํ ์ฒ๋ก CPU ํจ์จ์ฑ ํฅ์
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง ๋ฐ ์๋ ๋ฆฌ์์ค ๊ด๋ฆฌ
- ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ด๋ฆฌ ์์คํ
- ์์ธ ์์ ์ฑ ๋ณด์ฅ ๋ฐ ์๋ฌ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ IRC Client โโโโโบโ IRC Server โโโโโบโ IRC Client โ
โ (irssi) โ โ โ โ (HexChat) โ
โโโโโโโโโโโโโโโโโโโ โ โโโโโโโโโโโโโโโ โ โโโโโโโโโโโโโโโโโโโ
โ โ kqueue โ โ
โโโโโโโโโโโโโโโโโโโ โ โ Event Loop โ โ โโโโโโโโโโโโโโโโโโโ
โ IRC Client โโโโโบโ โโโโโโโโโโโโโโโ โโโโโบโ IRC Client โ
โ (Terminal) โ โ โ โ (Custom) โ
โโโโโโโโโโโโโโโโโโโ โ โโโโโโโโโโโโโโโ โ โโโโโโโโโโโโโโโโโโโ
โ โUser/Channel โ โ
โ โ Controller โ โ
โ โโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโ
- ์ธ์ด: C++98
- ๋คํธ์ํฌ: BSD Socket, kqueue (macOS/FreeBSD)
- ํ๋กํ ์ฝ: IRC (RFC 2812)
- ๋น๋ ์์คํ : Makefile
- ํ ์คํธ ํ๊ฒฝ: Docker (InspIRCd + irssi)
- macOS ๋๋ FreeBSD (kqueue ์ง์)
- C++ ์ปดํ์ผ๋ฌ (C++98 ํ์ค)
- Make
git clone https://github.com/your-username/irc_server.git
cd irc_server
make up./ircserv <port> <password>์์:
./ircserv 6667 mypassword# irssi ์ฌ์ฉ
irssi -c localhost -p 6667 -w mypasswordJOIN #general # ์ฑ๋ ์
์ฅ
PART #general # ์ฑ๋ ํด์ฅ
PRIVMSG #general :Hello everyone! # ์ฑ๋ ๋ฉ์์ง
PRIVMSG user123 :Hi there! # ๊ฐ์ธ ๋ฉ์์ง
NOTICE #general :๋ชจ๋๋ค ์๋
! # ๊ณต์ง ๋ฉ์์ง
TOPIC #general # ํ์ฌ ์ฃผ์ ํ์ธ
TOPIC #general :์ฑํ
์๋ฒ # ์ฃผ์ ์ค์
MODE #general +o user123 # ์ฌ์ฉ์์๊ฒ op ๊ถํ ๋ถ์ฌ
MODE #general +i # invite-only ๋ชจ๋ ์ค์
MODE #general +k secret # ์ฑ๋ ํค ์ค์
KICK #general user123 # ์ฌ์ฉ์ ๊ฐํด
KICK #general alice :์๋๋ฌ์์ # ๊ฐํด ์ด์ ์ ์ธ
KICK #general alice,bob :๋ค๋๊ฐ! # ์ฌ๋ฌ ์ฌ์ฉ์ ๋์ ๊ฐํด
MODE #general # ํ์ฌ ๋ชจ๋ ํ์ธ
MODE #general +o alice # ์ฌ์ฉ์์๊ฒ op ๊ถํ ๋ถ์ฌ
MODE #general +ik secretkey # ์ฌ๋ฌ ๋ชจ๋ ๋์ ์ค์
MODE #general -i # ๋ชจ๋ ํด์
MODE #general -k secretkey # ๋ชจ๋ ํด์
INVITE alice #private # ์ฌ์ฉ์๋ฅผ ์ฑ๋๋ก ์ด๋
INVITE bob #vip-lounge # ์ฌ์ฉ์๋ฅผ ์ฑ๋๋ก ์ด๋
for i in {1..100}
do
nc localhost 6667 &
done
ํ๋ก์ ํธ์๋ ์ค์ IRC ์๋ฒ์์ ํธํ์ฑ ํ ์คํธ๋ฅผ ์ํ Docker ํ๊ฒฝ์ด ํฌํจ๋์ด ์์ต๋๋ค.
cd irssi_docker
docker build -t irc-test .
docker run -it --name irc-container irc-test
# ์ปจํ
์ด๋ ๋ด๋ถ์์
inspircd --config /etc/inspircd/inspircd.conf &
tcpflow -i lo port 6667 -c &
irssi -c 127.0.0.1# TCP ํต์ ํจํท ์บก์ฒ
tcpflow -i lo port 6667 -c
# ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ํด๋ผ์ด์ธํธ ์ ์
irssi -c 127.0.0.1- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ํด๋ผ์ด์ธํธ๋น ~2KB
- ์๋ต ์๊ฐ: ํ๊ท 1ms ์ดํ
- CPU ์ฌ์ฉ๋ฅ : ์ ํด ์ 0.1% ๋ฏธ๋ง
- io ์ด๋ฒคํธ ๊ด๋ฆฌ ์ต์ ํ: io ๋ฉํฐํ๋ ์ฑ ๊ธฐ๋ฒ์ kqueue๋ฅผ ์ด์ฉํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋น๋๊ธฐ I/O ์ฒ๋ฆฌ
- IRC ํ๋กํ ์ฝ ํธํ์ฑ: ์ค์ ํด๋ผ์ด์ธํธ์ ์ฃผ์๊ธฐ๋ฅ์ ๋ํ ํธํ
- ๋์์ฑ ์ฒ๋ฆฌ: ์ด๋ฒคํธ ๋๋ฆฌ๋ธ ์ํคํ ์ฒ๋ก ๊ณ ์ฑ๋ฅ ๊ตฌํ
irc_server/
โโโ srcs/
โ โโโ main.cpp # ๋ฉ์ธ ์๋ฒ ๋ฃจํ
โ โโโ KqueueEventManager.cpp # kqueue ์ด๋ฒคํธ ์ฒ๋ฆฌ
โ โโโ CommandHandler.cpp # IRC ๋ช
๋ น์ด ์ฒ๋ฆฌ
โ โโโ UserChannelController.cpp # ์ฌ์ฉ์/์ฑ๋ ๊ด๋ฆฌ
โ โโโ SendMessage.cpp # IRC ๋ฉ์์ง ์ ์ก
โ โโโ User.cpp # ์ฌ์ฉ์ ํด๋์ค
โ โโโ Channel.cpp # ์ฑ๋ ํด๋์ค
โโโ includes/ # ํค๋ ํ์ผ๋ค
โโโ irssi_docker/ # Docker ํ
์คํธ ํ๊ฒฝ
โโโ Makefile