수리 공작소

[42Seoul] Ft_irc 회고 본문

Project/42Seoul

[42Seoul] Ft_irc 회고

suleee 2025. 2. 18. 16:43

과제 요구 사항

  • ircserv 라는 이름의 irc 채팅 서버를 구현
  • 필수 arguments 
    • port : 서버가 사용할 포트번호, 보통 IRC 서버는 6660-6669번 포트를 사용
    • password : client가 구현할 채팅 서버에 register할 때 인증을 위해 필요한 비밀번호
  • 동시에 여러 클라이언트의 요청을 처리할 수 있어야 하고, 응답이 없거나 정지된 상태가 되면 안됨.
  •  Fork를 사용해선 안되고, non-block I/O 방식을 사용해야 함.
  • 오로지 1개의 multiplexing (ex, poll() select()) 함수 호출이 있어야 함.
  • 클라이언트는 개발하는 것이 아니고, 상용 클라이언트를 사용. (ex, irssi)
    • 직접 개발할 irc 서버와 상용 클라이언트가 에러 없이 연결 및 동작 되어야 함.
  • 클라이언트와 서버의 통신은 TCP/IP (v4 or v6)을 기반으로 함.
  • 다른 상용 서버와 최대한 동작을 맞추어야 함.
  • 다음의 기능들을 구현하면 됨
    • 인증(Authenticate) 절차
    • 닉네임 및 유저네임 설정
    • 채널에 참여
    • 개인 메세지 주고 받기
    • 채널에 메세지 주고 받기 (모든 채널의 참여자가 이를 볼 수 있어야 함)
    • 채널 운영자와 일반 사용자가 존재
    • 채널 운영자에게 특별한 권한이 존재
      • KICK -  클라이언트 강퇴
      • INVITE - 클라이언트 초대
      • TOPIC - 채널의 주제 설정
      • MODE - 채널의 모드 설정
        • i - invite only 모드 on/off
        • t - 주제 설정 가능한 사람을 운영자로 제한 on/off
        • k - 채널 비번(키) on/off
        • o - 다른 이용자에게 운영자 권한 부여 및 박탈
        • l - 채널의 인원 제한 on/off
    • 상용 클라이언트 말고도 nc 명령어로 테스트 해볼 수 있음.
      • nc -C 127.0.0.1 6667 
      • 명령어 중간에 ctrl + D 가 입력되는 경우에도 명령어가 잘 처리 되어야 함. (우리 팀이 놓친 부분)

과제 진행 방식

파트 분배 

  • 서버 연결 (개념적으로 가장 중요한 부분)
  • 채널 관련 명령어
  • 운영자 관련 명령어

이렇게 세 파트로 나누었다. 나는 운영자 관련 명령어 파트를 맡게 되었다. 

과제의 핵심 내용을 생각해보자면

1. 소켓을 연결하여 tcp 기반의 클라이언트 - 서버 통신을 구현해보는 것 (서버 사이드)

2. 멀티플렉싱을 이용하여 하나의 서버에서 여러 클라이언트를 다룰 수 있게 하는 것

2. 정해진 프로토콜을 철저히 지켜서 메세지를 주고 받는 것 (공식 문서 기반하여)

참고한 문서

https://datatracker.ietf.org/doc/html/rfc1459

 

RFC 1459: Internet Relay Chat Protocol

The IRC protocol is a text-based protocol, with the simplest client being any socket program capable of connecting to the server. This memo defines an Experimental Protocol for the Internet community.

datatracker.ietf.org

https://www.rfc-editor.org/rfc/rfc2812.html

 

RFC 2812: Internet Relay Chat: Client Protocol

 

www.rfc-editor.org

https://www.rfc-editor.org/rfc/rfc2813.html

 

RFC 2813: Internet Relay Chat: Server Protocol

 

www.rfc-editor.org

 

사실 명령어 구현 파트를 이 세가지 문서와 상용 서버 Incspircd를 설치해서 동작을 비교해보면서 구현하면 된다. 

tcpflow -i lo port 6667 -c

 

해당 명령어를 통해 어떤 명령어들이 오고 갔는지를 볼 수 있다.

https://defs.ircdocs.horse/defs/numerics

 

Numerics

Numerics Revision 1.63 Red denotes a conflicting numeric definition, gray for deprecated (however quite possibly still in use), and blue for OK. indicates the nickname of the client who is receiving this message, which is present as the first parameter of

defs.ircdocs.horse

해당 페이지에 상황에 따른 서버에서 보내줘야 하는 numerical replies들이 정리되어있어서 편했다. 

공식 rfc 문서의 버전도 명시되어있고, 상용 irc 서버에서 추가적으로 사용하는 응답 번호들도 있다. 

상황에 맞는 응답을 찾는데 큰 도움이 되었다.

힘들었던 점 & 아쉬운 점

ft_irc 에서 맡은 파트의 특성이 구현이 어렵다기 보다는 얼마나 꼼꼼하게 규칙을 지키는지가 더 중요했던 것 같다. 

그래서 어떤 응답을 내 마음대로 빼먹거나 하면 동작이 안 될 수도 있다.

 

nc 명령어와 irssi 프로그램 동작이 다른 경우가 종종 있다. 예를 들어 내가 설치한 irssi의 버전에는 서버 연결 시작에 무조건 CAP LS 라는 명령어를 보내는데, 과제 구현 요구 사항에는 해당 명령어를 구현하라는 말이 없으므로 이에 맞는 처리를 알아서 해주면 된다. 그리고 PASS USER NICK을 이용한 인증 부분도 irssi에서는 /connect를 사용하면 자동으로 세개의 명령어를 세트처럼 묶어서 보내준다. 하지만 nc에서는 그런 동작이 없으므로 처음부터 둘 다 테스트를 해보며 진행을 하는 것이 좋을 것 같다. 제대로된 문서가 없이 irssi에 맞춰야 할 때, 정확히 어떤 식으로 동작을 하는지 와닿지가 않을 때가 있어서 그걸 찾아내는데에 좀 시간이 들었다.

 

사실 가장 중요하고 얻어갈만한 파트는 맨 처음의 poll을 이용한 서버 연결 수립 부분인데 이에 대해서 개념만 달달 외우는 느낌으로 학습한 것이 아쉬웠다. (어차피 exam을 보려면 공부해야하는 부분이었지만)

 

또, 서브젝트에 ctrl + D에 대한 처리를 해야한 다는 것을 완전히 까먹은 것이 매우 아쉽다. 해당 처리를 고려했다면, 코드의 구조가 크게 바뀌었을 것 같다. 생각보다 중요한 부분을 빼먹고 구현을 했다는 생각이 들어서 아쉬운 마음이 들었다.