packet session

ㅋㅋ·2022년 10월 31일

csharp게임서버

목록 보기
11/16
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 통신상 데이터 흐름 제어로 인해 주고받은 패킷의 사이즈가 기대했던 것과 다를 수 있어,

패킷이 온전치 않다고 판단되면 후속 패킷을 기다리도록 해야함

0개의 댓글