Skip to content

irssiServer/irc_server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŒ IRC Chat Server

๊ณ ์„ฑ๋Šฅ ๋ฉ€ํ‹ฐํด๋ผ์ด์–ธํŠธ IRC ์ฑ„ํŒ… ์„œ๋ฒ„ ๊ตฌํ˜„ ํ”„๋กœ์ ํŠธ

๐Ÿ“š ๊ธฐ์ˆ  ๋ฌธ์„œ


๐Ÿ“– ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์ด ํ”„๋กœ์ ํŠธ๋Š” 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 mypassword

๐ŸŽฎ ์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ IRC ๋ช…๋ น์–ด

์ฑ„๋„ ๊ด€๋ฆฌ

JOIN #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

๐Ÿ”ง ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ

Docker ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

ํ”„๋กœ์ ํŠธ์—๋Š” ์‹ค์ œ 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% ๋ฏธ๋งŒ

๐Ÿ† ์ฃผ์š” ์„ฑ๊ณผ

๊ธฐ์ˆ ์  ํ•ด๊ฒฐ ๊ณผ์ œ

  1. io ์ด๋ฒคํŠธ ๊ด€๋ฆฌ ์ตœ์ ํ™”: io ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ ๊ธฐ๋ฒ•์˜ kqueue๋ฅผ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ I/O ์ฒ˜๋ฆฌ
  2. IRC ํ”„๋กœํ† ์ฝœ ํ˜ธํ™˜์„ฑ: ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ์™€ ์ฃผ์š”๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ˜ธํ™˜
  3. ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ: ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ณ ์„ฑ๋Šฅ ๊ตฌํ˜„

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages