PacketSession

์›๋ž˜๋ฒŒ๋ ˆยท2022๋…„ 9์›” 3์ผ
0
post-custom-banner

๐ŸŒž Packetํด๋ž˜์Šค์˜ ์‚ฌ์šฉ๋ฒ•

  • Packet ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ packetId๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค packet์„ ๋ณด๋‚ด๋Š”์ง€ ์‹๋ณ„ํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ packetId๋งŒ์„ ๊ฐ€์ง€๊ณ ๋Š” ๊ฐ€๋ณ€์ ์ธ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น packet์˜ size ๋˜ํ•œ ๊ฐ์ฒด์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    class Packet
    {
        public ushort size;
        public ushort packetId;
    }
  • ๋˜ํ•œ ํŒจํ‚ท์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ‰์†Œ์ฒ˜๋Ÿผ ๋ง‰ ์จ์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋งŒ์•ฝ 1๋งŒ์˜ ์œ ์ €์—๊ฒŒ 1byte๋งŒํผ์„ ๋œ ๋ณด๋ƒ‡๋‹ค๋ฉด 1๋งŒ byte ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ‚ท์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž˜ ์‚ฌ์šฉํ• ์ค„ ์•Œ์•„์•ผํ•œ๋‹ค.

๐ŸŒž PacketSession

์ด์ œ ํŒŒ์‹ฑ์„ ํ•ด์ฃผ๋Š” PacketSession์„ ๋งŒ๋“ค์–ด ์ค„ ๊ฒƒ์ด๋‹ค.
ํŒŒ์‹ฑ์ด๋ž€ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ•ดํ•˜๊ณ  ์กฐ๋ฆฝํ•˜์—ฌ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

    public abstract class PacketSession : Session
    {
        public sealed override int OnRecv(ArraySegment<byte> buffer)
        {
            return 0;
        }
        public abstract void OnRecvPacket();
    }

override ํ•œ์ •์ž๋ฅผ ํ†ตํ•˜์—ฌ ์ถ”์ƒํด๋ž˜์Šค ์ž„์—๋„ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ sealed ํ•œ์ •์ž๋ฅผ ํ†ตํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์ƒ์†์„ ํ†ตํ•ด์„œ ์žฌ์ •์˜ ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ OnRecvPacket์„ ํ†ตํ•ด์„œ Packet์„ ๋ฐ›๊ณ  ๊ทธ ํ›„์˜ ์ฒ˜๋ฆฌ๋Š” PacketSession์˜ OnRecv์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

    public abstract class PacketSession : Session
    {
        public static readonly int HeaderSize = 2;
        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;

                // ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์œผ๋ฉด ํŒจํ‚ท ์กฐ๋ฆฝ ๊ฐ€๋Šฅ
                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);
    }

OnRecv๋ฉ”์†Œ๋“œ๋Š” ๋ฐ›์€ ํŒจํ‚ท ํด๋ž˜์Šค๋ฅผ ํŒŒ์‹ฑ์„ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
์ธ์ž๋กœ ํŒจํ‚ท์ด ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋ฐ›์•„์„œ ์ด๋ฅผ ๋ถ„์„ํ•œ๋‹ค.
if(buffer.Count < HeaderSize) ๋ถ€๋ถ„์€ ์ตœ์†Œ 2๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋Š” ๋ฐฐ์ œํ•ด์ค€๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์€ ํŒจํ‚ท์˜ ์‚ฌ์ด์ฆˆ์˜ ํ•ด๋‹น์ด ๋˜๊ฒŒ๋” ๋ฐ์ดํ„ฐ๊ฐ€ ์™”๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
ํ˜„์žฌ ushort๋กœ size ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— BitConverter๋ฅผ 16๋น„ํŠธ ๋ฒ„์ „์œผ๋กœ ํ•˜์—ฌ size๊ฐ’์„ dataSize์— ์ €์žฅํ•˜์˜€๋‹ค.
ํ•ด๋‹น dataSize์˜ ๊ฐ’๋ณด๋‹ค buffer์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์„œ๋Š” ์•ˆ๋œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ํ™•์ธ์ด ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ OnRecvPacket์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ฝ์€ ํŒจํ‚ท์€ ๋‹ค์ฝ์—ˆ๋‹ค๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์œ„ํ•˜์—ฌ buffer๋ฅผ dataSize๋งŒํผ ์•ž์„ ์ œ์™ธํ•œ๋‹ค.

  • ๊ฒฐ๋ก ์ ์œผ๋กœ Parsing์„ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋‚ด๋ถ€์—์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ด๊ณ , ์ฝ˜ํ…์ธ  ๋‹จ์—์„œ๋Š” ์ง‘์–ด์ค€ data์˜ buffer๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„๊ฒƒ์ด๋‹ค.
profile
ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ๋‹ด์€ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€