-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
미해결
세션패킷과,버퍼 질문
21.08.29 02:09 작성 조회수 224
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);
코드 흐름이 이해가 안가네요 쉽게 설명해주실수 있나요?
답변을 작성해보세요.
2
Rookiss
지식공유자2021.08.29
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)를 해줘서 사용한 만큼만 지정해서 닫아주고 있습니다.
답변 1