vivimbob / ft_irc Goto Github PK
View Code? Open in Web Editor NEWCreate your own IRC server in C++, fully compatible with an official client.
Create your own IRC server in C++, fully compatible with an official client.
recv()를 한 이후에 에러 처리에대한 분기 문이 없음
E_AGAIN 이랑 E_WOULDBLOCK
E_INTR
그 외에 대한 에러들에 대한 분기를 만들겠음
채널에 들어올 수 있는 유저 수 체크, 유저가 들어와있는 채널 수 체크, 현재 있는 채널인지 체크
채널 없을 시 최초 생성하고, 채널에 유저 등록
구현사항 (수정가능)
멤버 변수 목록
멤버 함수 목록
client00 부분 생성자 빠져서 채워넣음
처리해야 할 메시지를 쌓아 놓을 자료구조가 하나 필요함.
IRCMessage를 벡터로 쌓아 놓고 이름을 commands라고 하겠음
패스워드 메세지를 이렇게 저렇게 구현할 거고
이거는 이거를 참고할거고 일단 그 메뉴얼에 어디어디 부분을 참고해서
거기까지만 연동되게 할 거다으아으ㅏ
구현사항 (수정가능)
멤버 변수 목록
멤버 함수 목록
함수에 선언된 버퍼 서버 클래스로 옮기기
server.hpp에 중첩되어있는 m_client_info 구조체를 클래스 헤더파일로 빼내기
001 welcome 메시지 추가
client 등록 절차 완료 시 처리 되야하는 작업 함수로 묶어서 처리.
client 등록 절차 완료 시 001 welcome 메시지 발송
이제 irssi 클라이언트와 연결 가능해짐
생성자에서 유효한 메시지인지 체크
\r\n으로 끝나는지만 체크했음
512바이트인지, 유효한 커맨드인지, prefix를 닉네임 설정용도로만 썼는지 등을 추가로 체크 할 수 있을듯
구분된 부분에대한 게터를 구현함
메시지가 유효한지를 확인 할 수 있는 함수를 만듬
유저 추가 삭제, 채널 모드 설정, 유저 모드 설정, 관리자 추가 삭제
channel mode bit field (server측에서 channel mode 별로 처리한 결과를 담는 bool 비트)
Join, invite 설정, key 설정
- Channel modes
- User modes
메시지 담는 버퍼를 벡터에서 다른 걸로 바꿨다.
다 받고 난 이후에 string에 clear()를 사용했다.
sendbuffer클래스의 이름을 바꿨다.
run함수 구조를 짜려고 함
run 함수에 필요한 kevent 배열 class 서버에 추가하기
한 번에 읽을 큐 배열을 매크로 변수로 하려고 함
이벤트가 발생시 이벤트를 처리할 함수를 이름이라도 적어놓기
파일 형식 통일 IRCMessage.cpp >> ircmessage.cpp
numeric reply류 함수에서 굳이 client 레퍼런스를 인자로 받을 필요가 없었다.
그리고 공통적으로 받아야하는 인자면 들고 있는게 맞다.
그래서 client * 를 생성자될 때 인자로 받아 들고 있도록 변경했다.
numeric reply들이 인자로 Client를 받지 않도록 했다.
numeric reply에서 command 인자는 IRCMessage 클래스에서 멤버 변수로 들고 있어서, 그것도 인자에서 멤버변수로 대체했다.
클라이언트가 quit 메시지 날리면 그 클라이언트가 속한 채널에 있는 모든 클라이언트에게 서버가 응답 메시지 날림
테스트
client와의 연결을 정리하는 함수 disconnect를 만들고, 들어가야할 곳에 넣기
서버가 클라이언트 요청에 답할 때 쓰이는 메시지 형식이다.
reply.hpp를 만들어서 reply매크로 집합을 만드려고 한다.
기본적으로 구현해야 하는 생성자랑 함수의 틀만 만들었음
server00내용 테스트
구현사항
Server의 run 함수에서 kqueue 이벤트 처리
read일 때 write일 때
2번은 제가 할게요
Originally posted by @Yudongwoo in #94 (comment)
메시지를 보낼 때, 앞에서 부터 보낸다. 지금은 보낸 부분 내용을 지우도록 구현 되어있는데.
그러면 보낼 때 마다, 지우고, 안 지워진 부분은 앞으로 보내는 작업을 해야 해서 비효율적일 것 같다.
offset을 사용해서 어디까지 보냈는지 표시하는 변수를 하나 추가해서, 저 위의 작업을 생략한 클래스를 만드려고 한다.
구현사항
receive_client_msg, send_client_msg 함수 구현(에러 부분 제외)
1
2
3
4
5
메시지 파라미터 유효한지, 키는 있는지, 채널은 유효한지 체크
채널 이름과 키 맵으로 바인딩
에러 코드 define 상수에서 enum 형으로 변경
클라이언트가 pass 메시지를 통해 등록이 됐는지 여부를 저장하는 변수와
그걸 확인하는 함수, 값을 변경하는 함수등을 만들었습니다.
왜그러징
Originally posted by @atimangel in #92 (comment)
fatal은 종료 될 만한 에러 상황 인 것 같고
error는 종료 될 만큼 이상이 있는 것은 아닌데, 에러가 발생한 것 같고,
warn은 잘 모르겠음
info
debug
trace
레벨에 따른 기준을 정해서 출력 되는 메시지를 잘 관리 했으면 좋겠습니다.
낮은 레벨의 메시지는 안볼 수 있게 할 수 있는데 그러면, 개발 하거나 디버그 할 때 보면 좋을 것들이 낮은 레벨이고
서버를 돌릴 때 보면 좋은 것들이 높은 레벨인게 맞을 것 같습니다.
정리 되면 이 내용도 위키에 올립시다.
받은 메시지가 담긴 버퍼에서 \r\n으로 쪼갠 뒤 commands queue에 집어넣는다.
그 이후 commands queue에 쌓인게 있다면 처리하고 없다면 처리하지 않는다.
추가로 errno를 체크하는 부분은 삭제했다.
nickname 변경 사항 알리는 부분과 m_set_nickname 위치 변경
변경 사항 알리는 메시지 \r\n 누락 수정
channel 클래스 생성 및 기본 함수들 세팅
Server 클래스 구현
생성자
기능
m_client_map accept 함수에 추가
함수를 사용하면, 답장에 필요한 string이 반환되도록 만들었다.
언제 어떤 함수를 써야하는지 안는 이상 함수 포인터를 만들거나 switch를 하면 오히려 비효율 적이라 각각의 함수를 만들었다.
클라이언트에서 보낸 메시지를 가지고 PASS, NICK, USER 명령어 처리
(reply는 추후에 구현)
IRCMessage은 받은 문자열을 IRC규칙에 따라 파싱하고, 필요한 부분만 가져 올 수 있도록 하는 클래스다.
보낼 메시지를 IRC 규칙에 따라 작성하는데 쓰이기도 한다.
- 인자가 15개인지
- 유효한 커맨드인지
- 클라이언트가 prefix를 닉네임 설정외에 걸로 했는지 체크
1번
Originally posted by @atimangel in #94 (comment)
그럼 일단 0번을 구현합시다. 내가 할게영???
Originally posted by @minjakim in #94 (comment)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.