서버 공부

[서버 공부]16.PacketSession

myjeongjun 2025. 1. 16. 13:24

 

이번 시간에는 단순히 데이터를 주고 받는게 아닌 패킷안에 여러 데이터를 넣어놓고 주고받는식으로 설계하려고한다.

 

HeaderSize : 패킷에서 가장 첫부분은 패킷의 사이즈를 담은 데이터를 보내준다. 2로설정해놓았다는건 2byte =16bit로 표현된 패킷의 전체 크기가 들어있다는 뜻이다. 만약 사이즈가 8이라면 전체 크기가 8byte라는 뜻이고, 앞으로 6byte가 더 도착해야 해당 패킷을 전부 수신한것으로 처리 할 수있다.

 

while문 내부

 

1.if (buffer.Count < HeaderSize)
                    break;

-> 가장 앞에있는 사이즈 크기 데이터조차 오지 않았으니 break;

 

2.if (buffer.Count < dataSize)

       break;

->전체 패킷이 오지 않았으니 break;

 

3.                OnRecvPacket(new ArraySegment<byte>(buffer.Array,buffer.Offset,dataSize));

                processLen += dataSize;
                buffer = new ArraySegment<byte> (buffer.Array,buffer.Offset + dataSize, buffer.Count - dataSize);

 

-> 다 왔으면 조립가능한 상태이므로 보내주고 버퍼 시작점과 여유공간을 새로 설정해줌

 public abstract class PacketSession : Session 
 {
     public static readonly int HeaderSize = 2;
     //패킷에서 처음 오는정보를 size로 둬서 패킷의 크기가 얼마인지를 먼저 파악하게 해줌

     //sealed : 해당버전의 함수를 자식에서 ovveride못하게 막음
     public sealed override int OnRecv(ArraySegment<byte> buffer) 
     {
         

         int processLen = 0;

         while (true) 
         {
             if (buffer.Count < HeaderSize)
                 break;


             ushort  dataSize = BitConverter.ToUInt16(buffer.Array, buffer.Offset);

             //패킷이 다 안옴
             if (buffer.Count < dataSize)
                 break;

             //여기까지 왔으면 조립가능한상태
             //ArraySegment는 struct라서 new해줘도 heap에 할당안함
             OnRecvPacket(new ArraySegment<byte>(buffer.Array,buffer.Offset,dataSize));

             processLen += dataSize;
             buffer = new ArraySegment<byte> (buffer.Array,buffer.Offset + dataSize, buffer.Count - dataSize);
         }

         //처리한 바이트 수 반환
         return processLen;
     }

     public abstract void OnRecvPacket(ArraySegment<byte> buffer);
 }

'서버 공부' 카테고리의 다른 글

[서버 공부]18. Packet Generator 3,4,5,6  (0) 2025.01.27
[서버 공부]17.Packet Generator 1,2  (0) 2025.01.24
[서버 공부]15.SendBuffer  (0) 2025.01.15
[서버 공부]14. RecvBuffer  (0) 2025.01.15
[서버 공부]12 Session 1,2  (0) 2025.01.12