일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- discord bot
- c++ multi chatting room
- constructor
- std::cout
- std::vector
- c++ basic practice
- vector capacity
- delete function
- member function pointer
- virtual function
- increment operator
- suffix return type
- conversion constructor
- C++
- vector size
- std::ostream
- virtual destructor
- return by reference
- dynamic_cast
- base from member
- placement new
- this call
- new&delete
- virtual function table
- operator overloading
- std::endl
- virtual inheritance
- 더 지니어스 양면포커
- diamond inheritance
- pointer to member data
- Today
- Total
목록Toy Project/Multi Room Cheating Server (8)
I'm FanJae.
1. 프로젝트 요약- Multi Thread를 이용한 Multi-Chatting Room을 제공하는 서버이다. 1) 개발 환경 : C++(Server), C#(Client) OS : Windows2) 서버 아키텍처 : 클라이언트-서버 모델, 프로토콜 : TCP3) 라이브러리 : C#(UI Windows Forms), C++ (std::shtread) 2. 서버 구조※ 전체적인 흐름으로 보면 다음과 같다.- 연결이 수락된 이후 시점에서 ConnectClient()가 주기적으로 반복 메시지를 받아준다.- 이후 ClientEventHandler 객체에서 각 Event에 맞는 행위를 수행한다. 1) Worker-Thread : ConnectClient(SOCKET socket)void ConnectClient(..
1. Client Event 구현 1-1. Chatting Room 레이아웃 설계- 채팅창 레이아웃은 다음과 같이 설계하였다.- 원래라면 누군가 입장했다는 정보나 ID 등도 추가해야겠지만, 이번 토이 프로젝트에서는 넣지 않았다.- **님이 입장하였습니다.가 없다. (다음 토이 프로젝트에서는 좀 넣어서 깔끔하게 만들어보려 한다.) 1-2. 메시지 수신 처리 private void Receive() { try { while (isRunning) { byte[] buffer = new byte[4096]; int recv_le..
1. Client Event 구현- 지난 레이아웃 설계에 따라서 구현을 실행해야 한다.연결 : IP와 PORT를 입력하면 서버와 연결을 진행한다.새로고침 : Room list를 받아와서 보여준다. 사용자는 이곳에서 본인이 원하는 방에 입장할 수 있다.입장 : Room List에서 선택된 방으로 입장한다.방만들기 : 방을 만드는 폼을 별도로 띄워서 방을 생성하면 서버가 이를 받아서 하나의 방을 만들어준다.방을 만든 참가자는 채팅방에 바로 입장하도록 처리할 것이다. 1-1. 서버 연결private void ConnectButton_Click(object sender, EventArgs e){ if (IPTextBox.Text == "") { MessageBox.Show("IP 주소..
1. Handler Logic 분할 이유- 서버가 처리하는게 많아지면 함수를 분리하는 것이 보기가 훨씬 깔끔해진다.- 구현하는 입장에서도 특정 이벤트에 대한 처리를 어디서 하는지 확실히 알 수 있어 편해진다.2. Client_Handle.hconst std::string CLOSE_SOCKET = "/Close_Socket";const std::string COMPLETE_CREATE_ROOM = "/Complete_Create_Room";const std::string EXIST_ROOM = "/Exist_Room";const std::string NOT_EXIST_ROOM = "/Not_Exist_Room";const std::string NO_ROOM = "/No_Room";const std::st..
1. 레이아웃 설계- 본인의 경우 Client 쪽은 가볍게 설계 하는 것이 목적이였다. (서버를 테스트 하기 위한 목적이 더 컸다.)- 따라서, Client의 디자인은 기본에 충실하였다.- 각 기능은 아래와 같은 기능을 수행한다.연결 : IP와 PORT를 입력하면 서버와 연결을 진행한다.새로고침 : Room list를 받아와서 보여준다. 사용자는 이곳에서 본인이 원하는 방에 입장할 수 있다.입장 : Room List에서 선택된 방으로 입장한다.방만들기 : 방을 만드는 폼을 별도로 띄워서 방을 생성하면 서버가 이를 받아서 하나의 방을 만들어준다.방을 만든 참가자는 채팅방에 바로 입장하도록 처리할 것이다.2. 서버 버그 수정- 본 포스팅을 작성하기 전, C# 클라이언트로 연결 시도를 했으나, 번번이 실패했다..
0.설계 0-1. 쓰레드 추가시 고려가 필요한 사항 ① 쓰레드가 실행해야 하는 영역의 구분이 필요하다.- 어떤 부분부터 쓰레드가 실행해야 하는지 구분해서 이를 처리해야 한다.② 자원 동시 접근 방지- 쓰레드는 서로 동시에 실행되는 것처럼 보이지만 실제로는 수 많은 Context Switching이 일어난다.- 이 과정에서 어떤 쓰레드를 먼저 실행할지는 CPU의 스케줄링에 따라 달려있다.- 따라서 이를 적당히 동기화(synchronization) 해주는 작업이 필요하다. 0-2. Multi Cheatting Room의 구현 기법1) 과거 나의 생각- 소켓 프로그래밍의 개념을 완전히 잘못 이해하던 시절에 짠 코드가 존재한다.- 그 시절에는 이게 최선이라고 생각했고 내 나름대로 잘짰다고 생각했다....void..
1. 윈도우 소켓 프로그래밍 서버 설정- 윈도우 소켓(윈속)도 기본적으로 BSD 계열 유닉스 소켓과 유사한 부분을 많이 띄고 있다. 1-1. 윈도우 소켓 프로그래밍 서버의 설정 순서① 윈속(Winsock) 초기화 -> WSAStartup() 호출.② 소켓 생성 -> socket() 호출③ 소켓 주소 구조체 설정 -> sockaddr_in 구조체④ 소켓에 ip주소 및 포트 정보 할당 -> bind() 호출⑤ 연결 대기 상태 -> listen() 호출⑥ 연결 요청 수락 -> accept() 호출⑦ 소켓 종료 및 윈속 해제-> closesocket(), WSACleanup()- 위 순서대로 서버를 구성한다. ※ sockaddr_in 구조체 관련 정보typedef struct sockaddr_in {#if ...
1. 프로젝트 선택 이유1-1. 서버 재구축 및 복기- 나는 학부 시절 네트워크 프로그래밍 수업에서 프로젝트로 다중 채팅방을 제공하는 서버-클라이언트 시스템을 만들었다.- 하지만, 클라이언트 쪽에 너무 무게감을 주다가 결국, C 클라이언트로는 성공하였지만, GUI 클라이언트에는 적용을 실패했다.- GUI 클라이언트에 서버 통신을 적용하기에 앞서, 당시 상당히 비효율적으로 짰던 코드를 보면서 내가 무엇을 잘못 이해하고 넘어갔었는지 복기하고자한다. 1-2. 토이 프로젝트를 통한 재학습- 과거부터 이러한 서버 처리에 대해서 관심이 많았다.- 서버-클라이언트 구조에 대해서 다시 학습하면서 재밌게 공부해보고 싶다. 2. 개발 환경- 언어 : C++ (Server), C#(Client)- 운영체제 : Windows..