졸업 작품

졸업 작품/서버

C++ 스핀락 구현

학생이라 아직 잘 모릅니다.. 틀린 내용이 있으면 알려주시면 감사하겠습니다. ㅠㅜ 동기화를 맞추는 기법이 여러 개 있는데 그중 하나인 스핀 락에 대해서 한번 알아보고 기록해보았다. 1. 스핀락이란? 스핀 락은 mutex처럼 시스템 콜을 하여 락을 얻지 못하면 쉬는 방법이 아닌, 락을 걸지 못하면 무한 루프를 돌면서 계속 얻으려고 시도하는 동기화 기법이다. SpinLock은 불가능하면 다시 시도하고... 를 반복한다. 즉 쉬지 않기 때문에 바쁜 대기(busy wating)라고도 부른다. 바쁜 대기의 장점은 따로 시스템 콜이 들어가지 않아서 lock을 얻고 해제할 때의 비용이 매우 작다는 장점이 있다. 또한 자신의 시간을 다른 스레드에게 넘기지 않아 콘텍스트 스위칭이 잘 일어나지 않는다는 장점이 있다. 하지..

졸업 작품/서버

졸작서버 AWS 사용기

다른 친구들 컴퓨터에서 서버에 접속하기 위해서 서버를 띄운 컴퓨터를 포트 포워딩을 한다거나 서버 파일을 준다거나 하는 행위가 너무 번거로웠다. 또한, 나중에 혹시라도 스팀에 올릴일이 있을 수도 있으니 AWS에 서버를 올려보기로 결정했다. AWS 사용 일단 AWS에 회원가입 한다음 AWS 관리 콘솔에 들어간다음 EC2를 누른다. EC2는 용량을 늘였다 줄였다 할 수 있는 컴퓨터를 대여하는 서비스로, 리눅스 윈도우 같은 OS를 정하면 설치된 채로 인스턴스를 사용할 수 있다. EC2 서비스에 들어간뒤 새로운 인스턴스(새로운 컴퓨터)를 만들자. 이후 Windows를 선택한다. 딱히 졸작 서버에는 사용해야할 서비스가 없어서 바로 시작을 눌렀다. 인스턴스를 시작했으면 컴퓨터에 연결해보자. 원격 데스크톱 파일을 설치..

졸업 작품/서버

CMake 사용기

졸작 서버는 WindowsLinux Cross Platform한 서버이다. 이 프로젝트를 원래는 Visual stdio 하나로 Linux 전용 프로젝트를 만들어서 관리하고, Windows 전용 프로젝트를 하나 더 만들어서 소스를 옮기는 방식으로 사용하고 있었다. 하지만, 이 방식은 너무 원시적이고 귀찮다고 생각해서 선배의 조언과 함께 찾은 방법은 CMake를 사용하는 것이었다. 아직 CMake에서 완벽하게 숙달이 되지는 않았지만 어느정도 쓸만하게는 쓸 수 있게 만들어서 간단히 기록해보려고 한다. 1. CMake 설치 윈도우는 그냥 CMake 사이트(https://cmake.org/download/)에서 받아서 설치하면 끝난다. 하지만 리눅스(필자는 Redhat계열 Centos 사용 중)에서 설치하는 방법..

졸업 작품/서버

TCP / UDP 패킷 분리(Split) 현상 합치기

서론 졸업작품 프로젝트를 하면서 서버가 가끔씩 죽는 현상이 있었다. 이 현상은 부하가 적든 크던 어떤 메시지를 보내던 낮은 확률로 갑자기 죽는 현상이었다. 또한 클라이언트 측에서 수신할 때 패킷이 제대로 받아지지 않는 현상도 있었다. 분명 패킷의 손상은 L4에서 받을 때 체킹이 내부적으로 된다고 하였는데 말이다. 이 두개의 오류가 공존해서 어떻게 해야 할까, 감도 안 와서 무작정 디버깅을 열심히 했었는데 디버깅을 하다 보니 알게 된 신기한 일이 있었다. 그것은 바로 "패킷이 나눠져서 들어올 수 있다"는 것이었다. 패킷의 분리 현상 RCV_BUF 옵션(수신 버퍼의 최대 크기)을 100으로 설정했다고 가정하자. 그리고 메세지의 헤더에다가 메시지의 크기를 int형으로 담았다고 가정하자. 그럼 정상적인 패킷은 ..

졸업 작품/서버

C++ IOCP 서버 3. IOCP 구현 (작동부)

* 아직 배우고 있는 학생이라 틀린 내용이 있을 수도 있습니다. 틀린 내용이 있다면 알려주시면 감사하겠습니다. IOCP 이론 : https://developstudy.tistory.com/43?category=836040 IOCP 초기화 : https://developstudy.tistory.com/45?category=836040 이번 포스팅에서는 드디어 IOCP를 끝맺는다! 저번 포스팅까지는 IOCP를 사용하기 위해 준비를 했다면 이제는 직접 관리(작동)하는 부분을 정리할 것이다. 비동기 명령을 보내는 함수는 Post___()로 지었고, 결과를 받는 함수는 ____Proc(Overlapped*)로 지었으니 참고 바란다. 구현해야 할 명령은 총 4개이다. Send, Recv, Close, Accpet ..

졸업 작품/서버

C++ IOCP 서버 3. IOCP 구현 (초기화)

* 아직 배우고 있는 학생이라 틀린 내용이 있을 수도 있습니다. 틀린 내용이 있다면 알려주시면 감사하겠습니다. IOCP 이론 : https://developstudy.tistory.com/43?category=836040 C++ IOCP 서버 2. IOCP 이론 * 아직 배우고 있는 학생이라 틀린 내용이 있을 수도 있습니다. 틀린 내용이 있다면 알려주시면 감사하겠습니다. IOCP는 Window 환경에서 작동하는 제일 흔히 쓰이는 논블로킹 프로세스이다. 최소한의 쓰레드로 최.. developstudy.tistory.com 이번 포스팅에서는 IOCP 사용법을 포스팅할 것이다. IOCP 소켓을 구현하기 전에 먼저 해야 할 것은 오버랩 구조체를 만드는 것이다. 1. overlapped 구성 나는 오버랩을 아래와..

졸업 작품/서버

C++ 오브젝트풀

사실 나의 졸작게임 서버를 만드는 것에는 new와 delete를 남발해도 별일이 일어나지는 않는다. 어차피 2명만 수용하면 되기 때문이다.. 하지만 실제 게임 서버에서는 런타임 동적할당을 절대 사용해서는 안된다고 한다. 오랫동안 살아있는 채로 돌려야 하는데 메모리를 만들고 지우고를 계속하다가 메모리가 파편화돼서 그런 것 같기도 하고, new와 delete의 부하도 심해서 그런 것 같기도 하고, 정확한 이유는 모르겠지만 확실히 서버가 돌아가는 중에 동적할당을 써서 좋을 것은 없을 것 같다. 그래서 대게 이 문제를 메모리풀이나 오브젝트풀을 활용하여 해결한다고 한다. 오브젝트풀은 말그대로 오브젝트(클래스로부터 실체화된 친구들)들이 모여있는 곳으로, 초기화 단계에서 미리 왕~~~창 만들어두고 필요할 때는 꺼내 ..

졸업 작품/서버

C++ IOCP 서버 2. IOCP 이론

* 아직 배우고 있는 학생이라 틀린 내용이 있을 수도 있습니다. 틀린 내용이 있다면 알려주시면 감사하겠습니다. IOCP는 Window 환경에서 작동하는 제일 흔히 쓰이는 논블로킹 프로세스이다. 최소한의 쓰레드로 최대한의 효율을 뽑을 수 있다고 하는데 좀 더 자세히 살펴보았다. 먼저 이름의 뜻부터 살펴보자. IOCP는 IO Completion Port의 약자로 입출력 완료 포트라는 뜻이다. 여기서 사용하는 Port는 통신에서 사용하는 포트와 비슷한 의미로 어떤 항구, 그러니까 목적지라는 의미이다. 하지만 직접적으로 통신에서 사용하는 포트와는 전혀 다른 포트로 처음 공부할 때는 혼란이 올 수도 있다. 1. 비동기 I/O 시작 동기 함수(Connect Close Accept Send)과 같은 역할을 하는 비동..

졸업 작품/서버

C++ IOCP 서버 1. 동기 비동기

* 아직 배우고 있는 학생이라 틀린 내용이 있을 수도 있습니다. 틀린 내용이 있다면 알려주시면 감사하겠습니다. 소켓 프로그래밍에서 사용하는 함수는 기본적으로 블로킹(Blocking) 함수이다. Send(), Recv(), Connect() 등.. 소켓 함수로 요청을 하면 동기적으로 처리가 된다. 여기서 동기적이란? "흐름이 하나로 진행(동기화)된다"고 이해하면 편하다. 보통 동기적이라고 하면 동시에 무슨 일이 일어난다고 이해하기 쉬운데 프로그래밍에서는 반대인 듯하다. 반대로 비동기는 흐름이 넘어가지 않고 진행된다. 비동기가 동기보다 당연히 더 좋지 않을까? 싶었지만 생각해보면 여러 가지 고민할 것이 많아진다. 첫 번째로, Recv 완료 통지를 결국 어디선가는 받아야 한다. 그럼 Recv를 하는 부분이 아..

졸업 작품/클라이언트

스팀 SDK 콘솔 붙여보기

졸업작품 기획의 요구사항중에 "Steam ID로 접속하여 친구들과 플레이 한다."가 있었다. 이 시스템을 구현하기 위해서 먼저 Steam SDK를 사용하는 방법을 알아야 했는데, 언리얼에서 바로 써보기에는 언리얼의 컴파일 속도를 기다리기가 너무 싫어서 콘솔에 먼저 붙여보기로 했다. 먼저 스팀 SDK 사이트(https://partner.steamgames.com/doc/sdk)에 들어가서 스팀 SDK를 받고 압축을 풀면 아래와 같은 폴더들이 나온다. 여기서 중요한 폴더는 형광펜으로 칠한 public 폴더와 redistributable_bin 폴더! public 폴더에는 sdk의 인터페이스가 들어있고, redistributable_bin 폴더에는 플랫폼별 lib와 dll 파일이 들어있다. Steam SDK를..

장형이
'졸업 작품' 카테고리의 글 목록 (2 Page)