게임서버(47)
-
Serializing Buffer
안녕하세요 대학생 개발자입니다. 이번 글에서는 직렬화 버퍼에 대해서 얘기를 해보려고합니다. 지금까지 제가 TCP 프로토콜을 이용한 간단한 스트리트 파이터 같은 게임을 만들어봤는데요... 사실 이정도면 나름 완성이 되어있는 상태라고 봐도 무방합니다. 왜냐하면 사실 플레이어가 서버에게 보낼 수 있는 프로토콜은 전부 5바이트로 확정되어있기 때문이고 (이때문에 사실 링버퍼의 의미도 크게 없긴함) 5바이트로 되어있기 때문에 그냥 버퍼를 5바이트 잡고(char [5]같은걸로요) 그걸 패킷이라고 전달해줘도 되기 때문입니다. 하지만 큰 게임들은 가변 길이 버퍼를 많이 사용하게 되는데요... 가변길이 버퍼를 사용하게 되면 좋은점은 당연하게도 너무 큰 버퍼를 잡지 않아도 된다는 장점이 분명 있습니다. 우선 당장은 직렬화 ..
2021.11.23 -
WSAAsyncSelect로 게임클라이언트 제작
안녕하세요 대학생개발자입니다. 최근 어마어마한 과제와 어마어마한 일들로 인해서 포스팅을 하지 못했습니다. 드디어 과제가 끝나서 이 과제에 대한 포스팅을 해보려고 하는데요... 이번 글에서는 AsyncSelect 모델을 이용한 게임 클라이언트를 만들었고 그에대한 정리를 해볼겁니다. 이전에 말씀 드렸듯 AsyncSelect 모델은 최근 개발에서는 잘 사용하지 않는 모델입니다. WinMain에 상당히 종속적이고 싱글스레드에서 사용하기 좋기 때문입니다. 뭐 이런 내용은 지금당장 크게 중요한 부분은 아니니 실제 개발부분으로 들어가겠습니다. 시작하겠습니다 먼저 게임에 대한 프로토콜인데요. 일단 프로토콜은 예전의 별 찍기를 만들었던 것과 거의 비슷하게 될 것 같습니다... 우선 프로토콜은 두 종류로 나눠서 사용하고있..
2021.11.19 -
WSAAsyncSelect 그림그리기 클라이언트
안녕하세요 대학생개발자입니다. 이번에는 WSAAsyncSelect를 이용한 공유 그림판 클라이언트를 하나 만들어 봤어요. 사실 이벤트 드리븐이란게 진행도를 따로 그리기가 힘들어서 그냥 구조를 말로 설명드릴게요. 우선 내가 만든 소켓이랑 윈도우에 UM_NETWORK라는 메세지와 플래그로 FD_CONNECT, FD_CLOSE, FD_WRITE, FD_READ 정도를 async select하게 만들었습니다. 위쪽 소켓 초기화 부분은 비동기 소켓 하나 만들고 그냥 아이피 하나 읽어와서 연결하는 부분이라 따로 적진 않겠습니다. 네 뭐 이정도만 올려도 되겠죠? 우선 링거로 Time wait을 없애버렸고 WSAAsyncSelect로 메시지를 등록했습니다. 다음으로 이작업이 끝나게 되면 메시지를 기다렸다가 메시지가 뜨..
2021.11.13 -
WSAAsyncSelect
안녕하세요 대학생개발자입니다. 이번글에서는 AsyncSelect모델을 가지고 같이 그림을 그릴수 있는 보드를 만들어봤는데요... 우선 AsyncSelect가 뭔지 부터 간단히정리하고 가겠습니다. AsyncSelect 말그대로 select를 비동기적으로 수행한다는겁니다. select를 비동기적으로 한다는건 무슨의미일까요... 음... 일단 select를 다시한번 말씀드린다면... 게임에서의 select서버는 프레임에 맞춰서 루프를 계속 돌면서 폴링을 하는 방법이라고 정리를 했었습니다. 그럼 비동기 select니까 얘도 폴링을 하는 식으로 만들겠구나 라고 생각할 수 있는데요. 음... 사실 이부분에서 select와 async select모델은 전혀 다릅니다. async select의 경우에는 폴링기법으로 로..
2021.11.13 -
링 버퍼
안녕하세요 대학생 개발자입니다. 오늘은 링버퍼에 대해서 다뤄볼 예정입니다. 우선 시작하기 전에 게임서버에 링버퍼가 왜 필요한지에 대해서 간단히 설명해야될 것 같습니다. 게임서버는 당연히 빠른 속도와 안정성이 생명입니다. 안정성의 경우에는 모든 케이스에 에러체크를 하고 꼼꼼히 코드를 짜도 터지는 문제긴 하지만... 속도의 경우에는 다른데요... 어쩔수 없이 사용해야 되는 큰 코스트를 가진 함수들 가령... 입출력에 관련된 함수들, 혹은 매우 큰 로직, 했던 코드의 반복 이런 다양한 경우가 있을건데요 이번에 생각해볼것은 어쩔수 없이 사용해야 되는 큰 코스트를 가진 함수들에 대해서생각을 해볼겁니다. 우리가 socket io를 하게되면 어쩔수 없이 호출하는 함수중 가장 많은 비중이 차지하는 함수가 아마 send..
2021.11.12 -
select를 이용한 별움직이기 서버
안녕하세요 대학생 개발자입니다. 음... 마지막으로 올렸던 글에서는 별 움직이기 클라이언트에 대한 정리를 했었는데요 오늘은 서버에 대해서 정리를 해보려고 합니다...(오늘 테스트 하는데 혹시 서버가 죽을까... 무서웠습니다) 프로토콜은 이전과 동일합니다. 대신에 다른점은 그냥 이번에는 메세지 안에 헤더가 포함되어있다는 점 뿐??... 뭐 코드에서 아주조금만 달라지면 똑같은 결과로 나오니까... 뭐 특이점은 없습니다. 먼저 얘도 TCP 소켓하나 만들어서 리슨소켓으로 쓸거구요. +논블로킹 소켓으로 만들어줄겁니다. +서버의 경우에는 linger를 이용해서 time_wait을 없엘겁니다. 그외에는 특이사항이 없기 때문에 따로 코드를 올리진 않을거구요. 먼저 서버의 로직의 경우에는 클라이언트와는 좀 다를겁니다. ..
2021.11.08 -
select를 이용한 별움직이기 클라이언트
안녕하세요 대학생 개발자입니다. 이번 글에서는 과제였던... select를 이용해서 별움직이기 클라이언트를 만들어서 서버에 연결을 해보려고합니다.(물론 잘되야겠죠 ㅋㅋㅋ) 먼저 당연히 서버와 통신을 하려면 L7에서의 프로토콜이 필요합니다. 그럼 프로토콜을 잠시 보겠습니다. 네 메세지는 이렇게 생겼습니다. 일단 우선 Header가 있는데... 이건 제가 구현을 할때 Header로 buffer를 가르키고 Msg...를 가지고 buffer+4부분을 가르키게 구현했기 때문에 모든 메세지에 헤더가 붙지 않았습니다... 아 그리고 헤더에 보시면 not_used라는 항목이있는데요... 이게 원래 프로토콜에 따라서 사이즈가 다른경우가 대부분이겠지만 지금의 경우에는 제가 링버퍼를 구현을 못한 상태입니다. 그래서 아직 프..
2021.11.08 -
L4와 L7그리고 서버
안녕하세요 대학생 개발자입니다. 오늘은 주제가 다양하고 내용이 상당부분 겹치는 부분이있습니다... 내용이 많이 겹칠수도 있으니 이미 이전에 보셨던 분이라면 그 부분은 스킵을 하고 넘어 가셔도 좋을듯 싶습니다. 그럼 시작하겠습니다. 우선 마지막으로 올렸던 글에서는 winsocket api의 가장 기본이 되는 echo server에 나오는 비동기 send recv에 대해서 정리를 해봤습니다. 오늘은 살짝 주제를 바꿔보려고 합니다. 먼저 L2에는 ARP RARP등의 프로토콜이 존재합니다. L3에는 IP, ICMP등의 프로토콜이 존재합니다. L4에는 TCP, UDP등의 프로토콜이 존재합니다. 그들은 각각 자신의 프로토콜과 그에 맞는 syntax와 semantics를 가지고있습니다. 그것들을 가지고 통신을 정의하..
2021.11.04 -
Win socket API2
안녕하세요 대학생 개발자 입니다. 오늘도 역시 winsocket api에 대해서 정리를 해볼까 하는데요... 마지막으로 남겼을때가 listen, accept, bind, socket함수 정도 했었는데요 오늘은... 일단 에코서버의 남은 부분인 recv, send에 대해서 정리를 해볼까 합니다. recv에 대해서 먼저 설명을 해볼까 합니다... 일단 먼저 recv라고 하면 recieve의 줄인말이겠죠 . 받다. 도대체 받는다는게 무엇을 의미하는지 궁금합니다. 우리는 recv를 호출해야지 과연 상대방이 보낸 데이터를 우리의 TCP가 받아들이는 걸까요? 음... 우선 L7과 그 밑을 얘기를 해야겠는데요 먼저 TCP와 소켓은 커널입니다. 커널이라고 하면 우리가 접근할 수 없는 부분인데요... 왜 접근을 못하게 ..
2021.11.03 -
Window Socket API 기본 정리1
안녕하십니까 여러분 대학생 개발자입니다. OSI레이어부터 시작해서 L2 L3 L4까지 차근차근 하나씩 단계를 밟아가면서 정리했습니다. 이제 L5 ~ L7이라고 불릴 수 있는 어플리케이션 레이어에서의 네트워크를 정리하려고 합니다. msdn을 조금씩 참고해서 적긴하는데... msdn에 있는 문서나 사진을 올리진 않습니다... 제 머릿속에 있는 내용을 최대한 끄집어 내려고 하기 때문이니까... 이해 부탁드립니다. 음... 순서도 그렇고 내용도 그렇고 뒤죽박죽일겁니다... 하지만 이 블로깅에 목적은 역시 제가 나중에 다시 보고 공부하기 위해서 남기는 목적이다보니... 이런 배려는 없다는점 유의하시길 바랍니다 ㅋㅋㅋㅋㅋ 추가로 여기에 올라오는것중 많은 부분이 생략이 되어있을 겁니다. 그건... 다른 블로그나 다른..
2021.11.01 -
L4에 대한 정리2
안녕하세요 대학생개발자입니다. 이번글에서는 L4에 대한 정리를 또 해보려고 합니다. 저번글에서는 거의 TCP에 대한 얘기를 주로 했었었습니다. UDP에 대한 아주 짧은 내용과함께요. 이번 글에서는 TCP에 이어서 UDP에 대한 내용을 좀 정리하며 L4를 마무리 해볼까 합니다. 뭐.. 다들 아시겠지만 L4 스위치에는 공유기가 있습니다. 공유기가 어떻게 L4 스위치 역할을 하는가... 저는 사실 공유기는 L3기기인 줄 알고 있었는데 L4기기인 것 같더라구요. 왜냐면 공유기는 IP도 변경하지만 포트까지 변경해버리기 때문에 L4기기가 맞습니다. 우리가 데이터를 내보내면 공유기는 내부에서 dynamic port forwarding table을 만들어서 거기에 자신의 공인 아이피:포트 와 사설 아이피(호스트):포트..
2021.10.31 -
L4에 대한 정리
안녕하세요 대학생 개발자입니다. 이번엔... 음... L4입니다. 어쩌다 보니 그냥 순서대로 쭉 올라가는 중이네요... 이때까지 했던걸 아주 간략하게 적어보겠습니다. L2는 직접 연결된 두 개의 기기간 통신을 정의해놓은 레이어였습니다. L3는 간접적으로 연결되어있는 두 개의 기기간 통신을 정의해놓은 레이어였습니다. 간접적이라는 건 다른 노드들을 통해서 갈 수 있는 길이 만들어져 있다는 의미구요. 그렇기 때문에 L3부터는 이 데이터를 어디로 보내야 되는지에 대한 내용이 결정되는 구간입니다. 일단... 이번 글에서 제가 정리를 해보려고 하는 건 L4 레이어 중 TCP, UDP 정도입니다. 사실 TCP IP레이어라고 하면 거의 TCP와 UDP가 유일하죠... 먼저 L3까지 통과한 데이터는 이제 상대 호스트 내..
2021.10.31 -
L3에 관한 정리
안녕하세요 대학생 개발자입니다. 오늘은 L3에 대해서 정리를 좀 해보도록 하려고 합니다. L1, L2까지는 직접 연결된 단 두 개의 호스트만을 연결할 수 있는 방법에 대해서 제시를 하고 있었는데요 이제 L3로 오게 되면서 멀리 있는 호스트 즉 경유지를 거쳐서 직접 연결되지 않은 호스트에게 데이터를 전달할 수 있는 프로토콜이 등장하게 됩니다. 바로 IP라는 프로토콜입니다. 물론 OSI의 L3는 IP 다는 100% 맞다는 것은 아니지만 TCP/IP 4 layer에서는 일반적으로 IP이기 때문에 IP라고 말씀드렸고요. 그리고 주로 게임 서버에서는 IP 외에는 건드릴 경우가 없다고 생각해서 IP에 대해서 정리를 해보려고 합니다. 123.211.151.4와 같이 IP는 Dotted decimal type으로.으로..
2021.10.29 -
L2에 대한 내용 정리
안녕하세요 대학생 개발자입니다. 어제 글을 3개 적으면서 제가 다시 읽어봤는데 주저리주저리에 뇌피셜 가득인 글이더라구요... 어느 정도는 걸러서 들으시면 될 것 같습니다. 부족한 점 있다면 댓글로 잘못된 부분 말씀해 주신다면 반영해서 수정하도록 하겠습니다. 이번 글은 저번에 다 정리해보려고 했던 L7 to L7을 쪼개서 L2부분에 대한 내용만 좀 정리를 해보려고 합니다. 먼저 L2라고 한다면 ethernet을 통해서 전달되는 계층입니다. 즉 L1을 통해서 직접 연결되어있는 기기간의 통신을 정의하는 것입니다. 우선 L2는 연결된 모든 기기에게 데이터를 뿌린다 라는 개념이 존재합니다 브로드캐스팅이라고 합니다 그리고 내가 보내려고 하는 하나의 호스트에게만 데이터를 전달하는 유니캐스트가 존재합니다. 그리고 일부..
2021.10.28 -
내 손을 떠난 메시지 처리과정에 대한 정리
안녕하세요 대학생 개발자입니다. 이번 글에서는 TCP IP에 대한 간단한 정리..라고 적어놓고 나열을 해보겠습니다. 이번 글에서 주로 다루게 되는 내용은 다음과 같습니다. L7에서 메시지를 만들어서 다른 L7에게 전달을 하려고 한다면 어떤 일이 일이 일어나는지 간단하게 정리할겁니다. 그럼 시작하겠습니다. L7에서 AAA라는 데이터를 보내려고 한다면 우리는 API를 통해 전달을 해야 할 겁니다. 리눅스의 경우에는 오픈소스이기 때문에 커널이 오픈되어있고 커널에서 직접 뭔가를 할 수 있을것 같지만, 윈도우즈의 경우에는 유저에 대해서 커널이 닫혀있는 os입니다. 그러므로 우리가 직접 하드웨어를 제어하거나 커널에 직접 접근한다는 것은 불가능합니다. 그러므로 우리는 윈도우즈에서 제공하는 API를 사용해서 간접 접근..
2021.10.27 -
네트워크의 기본(TCP IP Layer (feat OSI 7Layer))
안녕하세요 대학생 개발자입니다. 이번 글에서는 기본적인 틀이라고 볼 수 있는 OSI 7Layer와 현재 가장 많이 사용하고있는 TCP/IP에 대해서 정리를 해보려고 합니다. 위 그림중 좌측에 보시는 게 osi 7 layer입니다. 하지만 저는 osi 7 layer는 완벽히는 모르고 tcp ip에 빙자해서 대략 설명하려고 합니다! 윗 계층부터 아랫 계층까지 출발해 보겠습니다. Physical layer 진짜 케이블을 의미합니다. 케이블이나 리피터 등 같은 그런 것들입니다. 데이터를 전기신호, 빛 신호 등을 이용해서 전달해주는 애들입니다. 리피터는 생겨먹은 것은 장비처럼 생겨서 L1스위치냐라고 물을 수도 있지만 주소가 존재하지 않을 뿐더러 네트워크 통신에서 그 어떠한 헤더를 뜯어볼 수도 없기 때문에 스위치라..
2021.10.27 -
Windows 에서 listen함수의 Backlog Queue의 크기를 구해보자.
안녕하세요 대학생 개발자입니다. 오늘의 목표는 listen을 했을 때 커널에 back log queue(listen queue)가 생기는데 그 큐의 사이즈의 크기를 코드로 직접 구해보려고 합니다. 서버 측에서 listen을 콜 할 때 SOMAXCONN -> 7fffffff signed int 중 가장 큰 값을 인자로 전달합니다. client에서 실제 connect를 과연 몇 개까지 할 수 있을까를 실험해봤습니다. client는 무한루프를 돌면서 loop back address:8000 으로 connect를 시도합니다. 실제 연결된 클라이언트 수는 200명에 불과합니다. 분명 나는 signed int 중 가장 큰 값인 7fffffff를 인자로 전달했는데 왜 200개밖에 되지 않을까? 당연히 21억어쩌고하는..
2021.10.27