• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

세션패킷과,버퍼 질문

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);

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

답변 1

답변을 작성해보세요.

2

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)를 해줘서 사용한 만큼만 지정해서
닫아주고 있습니다.