UnityServer - 패킷 생성기 (1)

k_hyun·2022년 11월 8일
0

Unity_Server

목록 보기
27/32

Packet Generator


패킷 생성 자동화를 위한 프로젝트를 하나 구성하였다.

PDL.xml

<?xml version="1.0" encoding="utf-8" ?>
<PDL>
	<packet name="PlayerInfoReq">
	<long name="playerId"/>
	<string name="name"/>
	<list name="skill">
		<int name="id"/>
		<short name="level"/>
		<float name="duration"/>
	</list>
	</packet>
</PDL>

패킷 형식을 위한 xml 파일이다.

Program.cs

using System;
using System.Xml;

namespace PacketGenerator
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true,
                IgnoreWhitespace = true
            };

            using (XmlReader r = XmlReader.Create("PDL.xml", settings))
            {
                r.MoveToContent();

                while (r.Read())
                {
                    if (r.Depth == 1 && r.NodeType == XmlNodeType.Element)
                        ParsePacket(r);
                    //Console.WriteLine(r.Name + " " + r["name"]);
                }
            }
        }

메인 함수에서 PDL파일을 파싱하는 동작을 수행한다.

        public static void ParsePacket(XmlReader r)
        {
            if (r.NodeType == XmlNodeType.EndElement)
                return;

            if (r.Name.ToLower() != "packet")
            {
                Console.WriteLine("Invalid packet node");
                return;
            }

            string packetName = r["name"];
            if (string.IsNullOrEmpty(packetName))
            {
                Console.WriteLine("Packet without name");
                return;
            }

            ParseMembers(r);
        }

패킷 단위로 파싱하는 함수이다.

        public static void ParseMembers(XmlReader r)
        {
            string packetName = r["name"];

            int depth = r.Depth + 1;
            while (r.Read())
            {
                if (r.Depth != depth)
                    break;

                string memberName = r["name"];
                if (string.IsNullOrEmpty(memberName))
                {
                    Console.WriteLine("Member without name");
                    return;
                }

                string memberType = r.Name.ToLower();
                switch (memberType)
                {
                    case "bool":
                    case "byte":
                    case "short":
                    case "ushort":
                    case "int":
                    case "long":
                    case "float":
                    case "double":
                    case "string":
                    case "list":
                        break;
                    default:
                        break;                        
                }
            }
        }
    }
}

패킷 안의 멤버들을 파싱하는 함수이다.

뒤의 부분은 미구현 상태이다.

0개의 댓글