인프런 커뮤니티 질문&답변

starkshn님의 프로필 이미지
starkshn

작성한 질문수

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

PacketSession

9분 OnRecv질문입니다.

작성

·

299

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)이 다 같은 말이라)

 

 

 

 

 

 

답변 1

1

Rookiss님의 프로필 이미지
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크기 일부가 합산된 상태의 데이터를 받은 상태겠죠.

starkshn님의 프로필 이미지
starkshn
질문자

답변 감사합니다

starkshn님의 프로필 이미지
starkshn

작성한 질문수

질문하기