(C#) Packet Generator [3]
포스트
취소

(C#) Packet Generator [3]

지난글(Packet Generator [2])에 이어서 개발을 진행한다.

💻 코드

실행에 필요한 구성 만들기

자동화 코드는 대부분 갖춰졌기 때문에 실행하기 위해서 나머지 필요한 부분을 넣어준다.
( 라이브러리, PacketID 추가 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// {0} 패킷 이름/번호 목록
// {1} 패킷 목록
public static string fileFormat =
@"using ServerCore;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;

public enum PacketID
{
    {0}
}

{1}
";

추가된 Format 내용 Main에 적용하기

  • Main에서 PacketFormat에 추가한 내용을 추가한다.
  • ParsePacket에는 packetEnums에 넣을 코드를 추가한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Program
{
    static ushort packetId;
    static string packetEnums;

    static void Main(string[] args)
    {
        using (XmlReader r = XmlReader.Create("PDL.xml", settings))
        {
            // {0} 패킷 이름/번호 목록
            // {1} 패킷 목록
            string fileText = string.Format(PacketFormat.fileFormat, packetEnums, genPackets);
            File.WriteAllText("GenPackets.cs", fileText);
        }
    }

    public static void ParsePacket(XmlReader r)
    {
        Tuple<string, string, string> t = ParseMembers(r);
        genPackets += string.Format(PacketFormat.packetFormat, packetName, t.Item1, t.Item2, t.Item3);

        // Enum 패킷 아이디에 넣을 코드 (띄어쓰기 + 탭)
        packetEnums += string.Format(PacketFormat.packetEnumFormat, packetName, ++packetId) + Environment.NewLine + "\t";
    }
}

Byte 자동화 추가

Byte Format 코드를 추가한다.

1
2
3
4
5
6
7
8
9
10
11
// {0} 변수 이름
// {1} 변수 형식
public static string readByteFormat =
@"this.{0} = ({1})segment.Array[segment.Offset + count];
count += sizeof({1});";

// {0} 변수 이름
// {1} 변수 형식
public static string writeByteFormat =
@"segment.Array[segment.Offset + count] = (byte)this.{0};
count += sizeof({1});";


ParseMember에 있는 switch에 적용해준다.

1
2
3
4
5
6
7
8
9
switch (memberType)
{
    case "byte":
    case "sbyte":
        memberCode += string.Format(PacketFormat.memberFormat, memberType, memberName);
        readCode += string.Format(PacketFormat.readByteFormat, memberName, memberType);
        writeCode += string.Format(PacketFormat.writeByteFormat, memberName, memberType);
        break;
}


강의에서 테스트를 한 결과 이중 리스트도 원활하게 자동화되는 것을 알 수 있었다.

대신 struct를 class로 바꿔줘야 한다.


💡 참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.