inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

PacketSession

9분 OnRecv질문입니다.

361

starkshn

작성한 질문수 134

1

 

Session에서 OnRecv부분 while문 안에서 

 

"패킷이 완전체로 왔는지"에대한 부분 질문입니다.

 

현재 OnRecv애서 buff를 받고 

 

첫번째 if 문에서 buff.Count < HeaderSize보다 작으면 break;이기때문에

 

buff.Count는 첫번째 if문을 통과를 했다면 2byte이상인 상태이고

 

두번째 if문은 

 

 

이부분인데 Bitcinverter.ToUInt16이 첫인자로 받은 바이트 배열을 buffer.Offset부터 시작해서 ushort형으로 뽑아서 준다는 것 까지는 이해했습니다.

그런데 

더미나 서버에서 패킷을 처리하기 위해서 OnRecv를 받을때

OnRecv에 받은 buff가 4바이트일 수도있고 3바이트 일 수도 있고

 

2바이트 일 수도 있는데

Bitcinverter.ToUInt16(buff.Array, buff.Offset)을 dataSize에 넣는다고 이게 왜 완전체인 패킷을 받는 다는 것인지 이해가 가지 않습니다.

 

< 가장 햇갈리는 부분 >

OnRecv에는 인자로 buffer를 받았는데

결국,

dataSize가 BitConverter를 통해서 받아온 buffer의 offset부터 buffer.Array(buffer의 크기)를 뽑아온 값(맞나요..?) 

즉,  BitCinverter.ToUInt16(buffer.Array, buufer.Offset)을 통해 뽑아온  dataSize는 (값은)

결국, 

OnRecv에 인자로 받은buffer의 크기 ( == buffer.Count)와 같은거라 

 

if (buffer.Count < dataSize)일때 break;가 아니라

 

if (buffer.Count != dataSize) 일 경우 break;를 하는게 

맞는 부분 아닌가요??

(인자로 받은 buffer.Count랑 buffer.Length가 같은말이고 

BitConverter.ToUInt16(buffer.Array, buffer.Offset)이 다 같은 말이라)

 

 

 

 

 

 

unity network C#

답변 1

1

Rookiss

Bitcinverter.ToUInt16(buff.Array, buff.Offset)을 dataSize에 넣는다고 이게 왜 완전체인 패킷을 받는 다는 것인지 이해가 가지 않습니다.

패킷 보내는 부분을 다시 살펴 보시면,
패킷의 사이즈를 해당 위치에 2바이트로 기입을 해주고 있습니다.
따라서 받는 쪽에서도 첫 2바이트의 데이터를 참고해서 패킷의 사이즈를 얻어오는거죠.

if (buffer.Count < dataSize)일때 break;가 아니라
if (buffer.Count != dataSize) 일 경우 break;를 하는게 
맞는 부분 아닌가요??

아닙니다. 실제 데이터는 해당 패킷 이상으로 올 수도 있으니 < 로 봐야 맞습니다.
ex)
[A 패킷    ][ B 패킷 일부 .. ] 이렇게 왔다면 A+B크기 일부가 합산된 상태의 데이터를 받은 상태겠죠.

0

starkshn

답변 감사합니다

TLS 질문드립니다.

0

57

2

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

0

57

2

Unity Span

0

82

2

XML, Dll 차이점

0

111

2

Session 질문입니다

0

84

1

Write Read 커서 키워드

0

79

1

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

0

76

2

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

0

100

2

UnhandledException 으로 서버 터지는 경우

0

91

2

컨텐츠 단, 엔진 단

0

108

1

질문 있습니다

0

78

2

C# 게임서버 3D MMORPG

0

153

2

유니티6 버전

0

100

2

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

0

135

2

커서의 위치의 중요성

0

105

2

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

0

171

2

강의에 질문이 있습니다

0

89

2

멀티스레드 이해도 질문

0

98

1

500 vs 500

0

132

3

OnAcceptHandler 액션 함수

0

64

1

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

0

194

2

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

0

84

2

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

0

107

1

스핀락 질문.

0

111

2