- 데이터를 주고받을 때 복수의 형태(정수 3개, 문자열 2개 이런식)
- 바이너리로 주고받음
- 그런 것들을 프로그래밍 언어에 맞게 맞춰야해서 직렬화 라이브러리 사용
- 이 기종간 제일 유명한게 프로토콜 버퍼?
- 스키마를 정해주면 내가 원하는 언어로 번역해줌
- 동일언어끼리 통신한다면 더 편한 것 사용가능
- ReceiveFilter가 핵심
- TCP기 때문에 필요
- TCP : 스트림
- UDP에서는 Send를 두번하면 받는 쪽도 Recv를 두번해야 다 받아짐 완전 분리
- 근데 TCP는 스트림(흐름)이라서 붙어있어서 Send를 빠르게 두번 하면? Recv 한번에 받아짐 소켓에 붙어있는거 다 가져옴
- 근데 버퍼 크기 써있으니까 헤더같은데에 그만큼만 가져오긴 함
- 두개니까 패킷을 쪼개야하는데 구분이 필요 → ReceiveFilter로 처리
- 패킷마다 크기가 다를거니까 헤더가 있고 헤더에서 패킷의 크기가 어떤지 알 수 있음
- FixedHeaderReceiveFilter가 슈퍼소켓꺼 : 헤더가 고정되어있다는 뜻
- 이걸 상속받은 ReceiveFilter가 GetBodyLengthFromHeader 메서드에서 헤더를 읽고 거기서 바디 길이 얻어옴
- 이제 헤더 크기 + 얻은 바디 크기 = 패킷 하나의 크기
- EFBinaryRequestInfo가 하나의 패킷을 가르키는 클래스
- 패킷 내용 정의? 같은거
- BinaryRequestInfo 상속받아야함
- 받은 패킷 크기가 이제 알아낸 패킷의 크기보다 크거나 같으면? 패킷이 온걸 암
- ResolveRequestInfo 호출해서 패킷 해석?
- bodyBuffer가 아니고 정확하게는 readBuffer인데 그 안에 body가 있을걸 암시하는 이름?
- 소켓에서는 동적할당을 최대한 안하기 위해서 큰 링버퍼를 하나 만들고 그걸 계속 재사용함
- 그래서 offset이 계속 바뀌어서 매개변수로 offset 받는듯
- 원래 슈퍼소켓에는 FixedHeaderReceiveFilter 구분자를 기준으로 구분하는 클래스도 있고 딱 정해진만큼의 패킷 크기만으로 구분하는 애들도 있긴했음 → 이런거 써서 ReceiveFilter 안구현해도 되긴함
- 근데 게임에서는 그렇게 안되고 패킷이 다 달라서? 아무튼 안가져오셧다
- 메세지 팩 : 역직렬화 할 때 어떤 클래스로 될지 알려줘야함 → 헤더는 안함 그래서 헤더 내용 읽어서 어떤 클래스로 역직렬화 할지 알아냄
- 헤더와 바디 한번에 인코딩 못함 따로 해야함 헤더는 직렬화 하면 안됌(읽어서 바디가 뭔지 알아내야하니까)
- 심하면 3번의 할당 1번의 복사까지 발생 가능 → 성능 원하면 이게 아쉬움
- 헤더하고 바디를 한번에 직렬화? 대신 헤더부분을 실제로 쓸 때는 헤더의 앞부분에 바이너리로 접근해서 헤더부터 빼내기?
- 그러면 다른 방식으로 해야함
- 내가 본 코드에서는 따로 한거
- 새 방식은 PvPGameServer에 ReceiveFilter.cs에 있음
- 메모리 팩으로 직렬화 하면 1바이트가 무조건 생김 → int를 직렬화하면 원래 4바이트인데 5바이트가 됌
- 맨 앞 1 바이트는 메모리팩? 그래서 오프셋 + ~~START_POS 더한곳에서 시작해서 헤더 가져오기
- 바디 읽을 때는 offset에서 헤더만큼 왼쪽으로 보내서 (offset - HEADER_SIZE) 한 곳에서부터 바디 읽어오기
- 근데 링버퍼 써서 이렇게 가다가 범위 벗어날수도있어서 안나가게 해야함
- 현재 오프셋이 헤더 사이즈보다 작으면 헤더와 보디를 직접 합쳐야한다? 돌아서 바디가 앞쪽에 있고 헤더가 뒤에?
패킷 처리 PacketProcess
MemoryPackPacketHeadInfo : 바이너리를 주면 자기가 1바이트 이동한 후에 패킷 사이즈, 아이디 같은거 얻어옴
헤더와 바디를 동시에 직렬화
Hive, 게임 서버는 N대
매칭서버 1대
대전 서버는 일단은 1대 나중에 되면 N대 5?6주차 쯤 매칭 연동 되면 N대로
웹 호스팅 방식을 가져와서 콘솔에서? 제네릭 호스트
이거 써서 appsettings.json 읽을수있음?
클라이언트가 보내는 패킷의 크기는 최대 1000 이상이면 안됌
appsettings.json에서 MaxRequestLength