작성
·
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
Bitcinverter.ToUInt16(buff.Array, buff.Offset)을 dataSize에 넣는다고 이게 왜 완전체인 패킷을 받는 다는 것인지 이해가 가지 않습니다.
패킷 보내는 부분을 다시 살펴 보시면,
패킷의 사이즈를 해당 위치에 2바이트로 기입을 해주고 있습니다.
따라서 받는 쪽에서도 첫 2바이트의 데이터를 참고해서 패킷의 사이즈를 얻어오는거죠.
if (buffer.Count < dataSize)일때 break;가 아니라
if (buffer.Count != dataSize) 일 경우 break;를 하는게
맞는 부분 아닌가요??
아닙니다. 실제 데이터는 해당 패킷 이상으로 올 수도 있으니 < 로 봐야 맞습니다.
ex)
[A 패킷 ][ B 패킷 일부 .. ] 이렇게 왔다면 A+B크기 일부가 합산된 상태의 데이터를 받은 상태겠죠.
답변 감사합니다