분류 전체보기

졸업 작품/서버

드디어 고쳤다...

더미 클라이언트 동접 천명으로 테스트하려고 했는데 서버가 자꾸 터지는 현상이 있었다..... 심지어 오류가 계속 여기저기 이상한 곳에서 계속 다르게 일어나는 오류였다... 갑자기 멀쩡히 있던 mutex가 죽지를 않나, 멀쩡하던 string에서 할당하다가 죽지를 않나... 웃긴것은 TCP 테스트만 켜놓으면 안터지고, UDP 테스트만 켜놔도 안터지는데, 둘다 키면 터지는 것이었다... 이것에 대한 원인은 이거였다. WSARecv와 WSARecvFrom에다 넘기는 HANDLE 타입의 flags와 recvBytes가 주소값인데, 정확한 이유는 모르겠지만 Pending이나 두개의 함수가 동시에 들어갔을 때, 비동기적으로 저 주소안의 값이 바뀌어 버리는 것 같다. 그래서 저 두개의 변수를 클래스 멤버 변수로 할당하..

졸업 작품/서버

1학기 발표자료 - 졸작서버 개선기

기말 발표로 사용한 자료. 3시간만에 만들고 제출해서 좀 내용이 엉망인 기분 ㅋㅋㅋㅋ

졸업 작품/서버

1학기 발표자료 - 졸작서버 제작기

이득우 교수님께서 이 발표자료를 짧게 발췌해서 언리얼 써밋에 발표하신게 꽤 오래 기억에 남을 것 같다. 낄낄

졸업 작품/서버

1학기 결산

1학기 동안 한 내용을 간단하게 정리하면 다음과 같다. 1. IOCP Epoll 크로스 플랫폼 자체 서버 구현 (이름하야 JHNET!!) 2. JHNET 하트비트 서버 (서버가 죽으면 되살림) 3. UE4 JHNET 대응 모듈 구현 (RPC, 변수 동기화, 위치 동기화 구현, 로비 구현) 1학기는 클라이언트 구현에 50% 정도 시간을 쏟아서 생각보다 한 게 별로 없고, 클라 변화에 쉽게 대응하는 부분에 초점이 많이 맞춰져 있었다. 그래서 매크로와 템플릿을 사용하여 최대한 빠른 시간에 동기화를 맞추고 버그를 쉽게 트래킹 하도록 만드는 것이 중심이었다. 그래서 구현한 결과는 다음과 같다!! 이제 어느 정도 클라이언트는 끝났으니까, 클라이언트 친구들에게 나머지 클라이언트를 맡기고 방학과 2학기는 서버에 매진하..

졸업 작품/서버

쓰레드와 Sleep

개요 CPU의 능력을 말할때 N코어 M쓰레드 라는 말을 언뜻 들은적이 있었다. 하지만 이게 정확히 무슨 뜻인지 잘 모르고 넘어갔다. 하지만 쓰레드를 나누다보니 CPU 사용률이 치솟는 현상이 있었고, 이 현상을 고치는 방법에 대해서 찾으면서 CPU와 Sleep 함수, 쓰레드에 대해서 간단하게 정리해보았다. CPU 코어? 쓰레드? CPU의 능력을 말할 때 사용하느 코어와 쓰레드는 무슨 용어일까? 나는 처음에 이것이 프로그래밍의 쓰레드와 관련이 없는줄알았다. 왜냐하면 내 컴퓨터는 4코어 4쓰레드였는데, 쓰레드 100개짜리 프로그램을 돌려도 CPU가 100%가 되지않고 잘 돌았었기 떄문이다. 하지만 이것은 그냥 나의 어림짐작 지식이었고, 진짜 내용은 다음과 같이 정리되었다. 일단 4코어 4쓰레드와 4코어 8쓰레..

졸업 작품/서버

C++ MPSCQueue 분석 및 사용 (부제. memory order)

학생이라 아직 잘 모릅니다.. 틀린 내용이 있으면 알려주시면 감사하겠습니다. ㅠㅜ 이 소스 안되는 것 같습니다. 검증을 충분히 거치고 사용해주세요. X( 더 나은 방법에 대해서는 여기에 기록했습니다. 개요 서버를 리뉴얼하려고 하면서 필요하게 된 자료구조는 다중 입력 싱글 출력이 가능한 큐였다. 그래서 MPSCQueue(Multi Produce Single Consume Queue)가 필요하게 됬는데, 너무 생소한 분야라 라이브러리를 쓸까? 생각했지만 그래도 시간도 있으니 한번 직접 구현해보자! 결정했다. (정확히 소스 분석...) 참고 소스는 여기 (https://github.com/mstump/queues) 분석하기 일단 풀소스는 다음과 같다. 네이밍은 필자 스타일에 맞게 조금 바꾸었다. #includ..

졸업 작품/서버

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형으로 담았다고 가정하자. 그럼 정상적인 패킷은 ..

장형이
'분류 전체보기' 카테고리의 글 목록 (6 Page)