[42Seoul] ft_irc (1)

tpwhzla·2023년 11월 8일

42Seoul

목록 보기
10/16

내가... 내가 마스터라니... 내가...

잡담 / 42Seoul 근황

CPP를 시작한다고 서브젝트 정리한 내용 올렸는데 어느새 CPP 09까지 끝냈고 방금 인셉션까지 끝냈다... 이걸 다 언제 정리하지?

+마스터가 되었다...
진짜 열심히 해야겠다... 완장 차 본 마지막 시점이 고등학교 때 반장이 끝이다...

ft_irc

C++ 98 버전을 이용하여 인터넷 릴레이 채팅(IRC)를 구현하는 과제이다. 대응되는 과제로는 Webserv가 있는데, 이너서클 최고존엄 과제로 드럽게 어렵다.
도망치려고 irc를 선택한 건 아니고... 트센을 해야 할 이유가 생겼다.
트센 백엔드가 장고로 바뀌었고... 파이썬을 이용한 자동화 스크립트와 아우터 AI 과제를 해야 할 예정이었던 나에게(아우터 AI 과제는 대부분 파이썬) 좋은 소식이어서 그렇다.
또, SEA:ME 준비를 하려면 최소 내년 초부터는 시작해야 하는데, 학교 졸업 + 멤버를 함께 이루고 본과정 레이스를 마치고 싶다.

내가 구현하는 채팅 서버는 여러 클라이언트의 동시 접속을 처리할 수 있어야 하며, 모든 입-출력 연산은 non-blocking 연산으로 처리되어야 한다.

서버를 구현할 때 필요한 주 기능은 사용자 인증, 닉네임 및 사용자명 설정, 채널 참여, 개인 메세지(DM) 송수신, 채널 운영자(admin) 전용 명령어 구현이다. 운영자 명령어에는 추방(KICK), 초대(INVITE), 주제 설정(TOPIC), 채널 모드 변경(MODE)등이 포함된다.

서버는 모든 가능한 에러와 이슈를 처리할 수 있어야 한다.

모든 통신은 TCP/IP(v4, v6) 프로토콜을 사용한다.

입 출력 관리를 위해 poll(), select(), kqueue(), epoll() 중 하나만 사용 가능하다.

MacOS에서는 write() 함수의 구현이 달라, non-blocking 모드 설정을 위해 fcntl() 함수를 사용할 수 있다.

TCP/IP (v4, v6)

프로토콜 : 데이터를 교환함에 있어 통신하는 기기나 프로그램 간에 지켜야 할 규칙과 표준의 집합.
네트워크 프로토콜은 패킷의 형식, 전송 타이밍, 데이터 교환 방식 등을 정의하며 이를 통해 다른 시스템이나 기기, 애플리케이션 간의 정보를 원활히 주고 받을 수 있도록 한다.

TCP/IP는 네트워크 포로토콜 스위트로, 온라인 상의 안전하고 효율적인 데이터 전송에 사용된다.
TCP/IP 모델은 두 개 기기 간의 데이터 전송을 담당하고 있다.

전송 제어 프로토콜(TCP)

데이터가 목적지에 신뢰성 있고 순서대로 도달하도록 보장하는 통신 규약이다.

TCP 서버 코드는 소켓을 생성하고 (소켓 생성)
포트 번호에 바인딩하고 (바인딩)
들어오는 연결을 수신 대기하며(수신 대기)
들어오는 연결을 수락한다

인터넷 프로토콜(IP)

IP는 데이터 패킷이 송신자로부터 수신자에게 올바르게 전달되는 경로를 전달한다.
IPv4와 IPv6은 서로 다른 버전을 가리키는데, IPv4는 32비트 주소를 가리키는 반면, IPv6은 128비트 주소를 사용하여 더 많은 기기와 네트워크를 수용할 수 있는 더 큰 주소공간을 제공한다.

IRC 구현 간에는 클라이언트는 내가 구현한 서버의 IP주소와 포트 번호를 사용하여 서버에 연결을 시도하게 되는데, TCP/IP 프로토콜을 사용하여 더 신뢰성 있는 연결을 하면서 데이터를 공유한다.

소켓 프로그래밍

소켓 : 네트워크를 통한 프로세스 간 통신을 가능하게 하는 기술.
네트워크 통신의 끝 점으로, IP주소와 포트로 정의된다.

애초에, IRC 과제 자체가 소켓 관련 함수들을 사용해서 서버를 구축해보는 과제이다.

서버는 소켓을 열고 (bind) 클라이언트의 요청을 청취하고(listen), 연결을 수락(accept)하고 데이터를 송/수신(send,recv)한다.

사용 가능 함수 :socket, close, setsockopt, getsockname, getprotobyname, gethostbyname, getaddrinfo,
freeaddrinfo, bind, connect, listen, accept, htons, htonl, ntohs, ntohl, inet_addr, inet_ntoa, send, recv, signal, sigaction, lseek, fstat, fcntl, poll
(or equivalent)

  1. socket (socket)
    서버와 클라이언트가 통신할 수 있는 소켓을 생성한다.

  2. setsocketopt (setsocketopt)
    소켓의 동작 변경을 위한 옵션을 설정한다.

  3. bind (bind)
    서버의 IP주소와 포트를 소켓에 연결한다.

  4. 연결 청취 (listen)
    서버가 클라이언트의 연결 요청을 청취하도록 설정한다.

  5. 연결 수락 (accept)
    클라이언트와 데이터를 주고 받는다.

  6. 데이터 전송 및 수신 (send, recv)
    클라이언트와 데이터를 주고 받는다.

  7. 호스트와 네트워크 바이트 순서 변환 (htons, htonl, nthos, ntohl)
    다양한 아키텍처 간 호환성을 위해 바이트 순서를 조정한다.

  8. 주소 변환 (inet_addr, inet_ntoa)
    IP주소를 문자열과 숫자 형태 사이에서 반환한다.

  9. 비동기 (fcntl)
    I/O 소켓을 non-blocking 모드로 설정한다.

  10. 이벤트 대기 (poll 또는 허용되는 함수들)
    여러 소켓에서 발생하는 이벤트를 효율적으로 기다린다

profile
DevOps / Infrastructure / Cloud Native / Platform Engineering

0개의 댓글