class Packet
{
public ushort size;
public ushort packetID;
}
public abstract class PacketSession : Session
{
public static readonly int HeaderSize = 2;
public sealed override int OnReceive(ArraySegment<byte> buffer)
{
int processLength = 0;
while (true)
{
if (buffer.Count < HeaderSize)
{
break;
}
ushort packetSize = BitConverter.ToUInt16(buffer.Array, buffer.Offset);
if (buffer.Count < packetSize)
{
break;
}
OnRecvPacket(new ArraySegment<byte>(buffer.Array, buffer.Offset, packetSize));
processLength += packetSize;
buffer = new ArraySegment<byte>(buffer.Array, buffer.Offset + packetSize, buffer.Count - packetSize);
}
return processLength;
}
public abstract void OnRecvPacket(ArraySegment<byte> buffer);
}
패킷은 당연하지만 데이터 크기가 작을 수록 좋음
=> 같은 장소에 사람이 많을수록 똑같은 패킷을 여러번 보내야하기 때문에 작은 차이가 큰 차이를 만들어 냄
패킷에는 가변적 데이터가 들어갈 수 있기 때문에 매번 크기가 달라질 수 있고,
그렇기 때문에 주로 패킷 맨 앞에 패킷의 총 크기를 적어서 보낸다.
받는 쪽은 우선적으로 크기부터 파싱하여 패킷 크기를 가늠하여 나머지를 파싱하게 됨
TCP 통신상 데이터 흐름 제어로 인해 주고받은 패킷의 사이즈가 기대했던 것과 다를 수 있어,
패킷이 온전치 않다고 판단되면 후속 패킷을 기다리도록 해야함