inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

PacketSession

세션패킷과,버퍼 질문

357

카카누

작성한 질문수 24

0

//최소한 헤더는 파싱(데이터를 읽을수 있는지)할 수 있는지 확인 

 if (buffer.Count < HeaderSize)

 break;

// 패킷이 완전체로 도착했는지 확인

ushort dataSize = BitConverter.ToUInt16(buffer.Array, buffer.Offset);

  if (buffer.Count < dataSize)

 break;

1.

최소한의 해더파싱은 Packet클래스의 size 는 2byte인데

완전체는 Packet클래스의 size,packet 4byte를 말하는게 아닌가요? 그럼 int로 받아야하는데 왜 ushort로 받나요?

2.

버퍼 카운터는 byte의 크기를 말하는건가요?

3.

ArraySegment<byte> openSegment = SendBufferHelper.Open(4096);

byte[] buffer =

BitConverter.GetBytes(packet.size);

byte[]buffer2 =

BitConverter.GetBytes(packet.packetId);

Array.Copy(buffer, 0, openSegment.Array, openSegment.Offset, buffer.Length);

Array.Copy(buffer2, 0, openSegment.Array, openSegment.Offset + buffer.Length, buffer2.Length);

ArraySegment<byte> sendBuff = SendBufferHelper.Close(packet.size);

코드 흐름이 이해가 안가네요 쉽게 설명해주실수 있나요?

network unity C#

답변 1

2

Rookiss

1.

2byte에 크기가 들어 있으니, 일단 2 byte 를 기다렸다
완전한 크기가 왔는지 체크하는 식으로 작업했지만
패킷 번호가 포함된 4byte를 기다려도 당연히 됩니다.

2.

네.

3.

ArraySegment<byte> openSegment = SendBufferHelper.Open(4096);

SendBuffer를 4096만큼 할당해서
[                            ]
여기다가 내용물을 기입하기 시작합니다.
최종적으로

[size | packetId | 패킷 내용물 ] 요렇게 되어야 하고,
그 작업을 아래에서 해주고 있습니다.

byte[] buffer = BitConverter.GetBytes(packet.size);
byte[] buffer2 = BitConverter.GetBytes(packet.packetId);
Array.Copy(buffer, 0, openSegment.Array, openSegment.Offset, buffer.Length);
Array.Copy(buffer2, 0, openSegment.Array, openSegment.Offset + buffer.Length, buffer2.Length);


C#은 C++처럼 포인터로 얍얍 복사가 힘들기 때문에 (unsafe 모드로 하면 안되는 것은 아니지만..)

우회해서 buffer, buffer2라는 바이트 배열을 만들어서 다시 넣어주고 있습니다.
Array.Copy는 구글에 검색해서 어떻게 동작하는지 MSDN을 살펴보시기 바라며,
C++의 memcpy랑 비슷한 개념입니다.

ArraySegment<byte> sendBuff = SendBufferHelper.Close(packet.size);
최초 할당받은 4096 바이트를 다 사용하지 않았으니,
Close(packet.size)를 해줘서 사용한 만큼만 지정해서
닫아주고 있습니다.

C#에서의 RAII

0

66

3

TLS 질문드립니다.

0

79

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

74

2

Unity Span

0

97

2

XML, Dll 차이점

0

134

2

Session 질문입니다

0

96

1

Write Read 커서 키워드

0

88

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

85

2

네트워크 Send 전담 스레드 배치

0

112

2

UnhandledException 으로 서버 터지는 경우

0

102

2

컨텐츠 단, 엔진 단

0

118

1

질문 있습니다

0

93

2

C# 게임서버 3D MMORPG

0

159

2

유니티6 버전

0

106

2

receive하는 부분과 send하는 부분의 차이

0

154

2

커서의 위치의 중요성

0

110

2

C++ 전혀 모르는데 C# 서버

0

176

2

강의에 질문이 있습니다

0

92

2

멀티스레드 이해도 질문

0

107

1

500 vs 500

0

147

3

OnAcceptHandler 액션 함수

0

70

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

204

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

86

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

112

1