C# 53

Packet Generator #6

이번 포스트에서는 이전의 PacketManager를 일일이 만들어주던 부분을 자동화하도록 수정하겠습니다.또 클라이언트와 서버의 패킷의 역할을 분리하여 동일한 패킷이 아닌각기 다른 패킷을 사용하도록 수정하겠습니다. 또한 패킷에 차이점을 두어클라이언트에서 서버로 전송하는 패킷의 경우 앞에 C_ 를 수식서버에서 클라이언트로 전송하는 경우 앞에 S_ 를 수식위와 같이 구성하여 최종적으로 각 진영의 PackManager에서 Register를 진행(=등록)하도록 하겠습니다. 1) 패킷 구조 xml  기존의 패킷 구조를 위와 같이 변경하였습니다.이전의 예제에서도 클라이언트가 서버로 전달하는 패킷의 경우에 데이터가 많이 포함되었으므로비교적 덜 사용하는 Te..

C# 2025.01.20

Packet Generator #5

이번 포스트에서는 기존의 패킷을 조금 더 개량하여인터페이스를 상속받아 패킷을 더 유동적으로 사용할 수 있게 개선해보겠습니다. 현재 패킷은 자동생성되고 있으므로 자동생성하기위한 양식에 조금만 변형을 가하면 패킷을 쉽게 변경할 수 있습니다. 1) PacketFormat class PacketFormat { . . .interface IPacket{{ ushort Protocol {{ get; }} void Read(ArraySegment segment); ArraySegment Write();}}{1}"; . . . // {0} 패킷 이름 // {1} 패킷 멤버 // {2} 멤버 변수 Read // {3} 멤버 변수 Wr..

C# 2025.01.20

Packet Generator #4

이번 포스트에서는 자동으로 생성된 패킷을 세션에 일일이 복사 + 붙여넣기 하는 방식을 수정하겠습니다.이전까지 PacketGenerator를 빌드하게 되면,아래와 같이 실행파일이 생성 + 동작하여 패킷을 생성하였습니다. 이제 새로 bat 실행 파일을 만들어 bat 파일을 실행하면 Client와 Server의 폴더 안에 패킷을 만들어주는 작업을 수행하겠습니다. 1) PacketGenerator...class PacketGenerator{ static string genPackets; static ushort packetID; static string packetEnums; static void Main(string[] args) { string pdlPath = "....

C# 2025.01.08

Packet Generator #3

이번 포스트에서는 Packet의 포맷이 아닌Packet을 담고 있는 파일 그 자체의 포맷을 만들도록 하겠습니다.추가적으로 byte 자료형에 대한 처리와 자료구조 안에 자료구조가 있는 경우도 어떻게 처리되는지 확인해보도록 하겠습니다. 1) PacketFormat class PacketFormat { public static string fileFormat =@"using System;using System.Collections.Generic;using System.Net;using System.Text;using ServerCore;public enum PacketID{{ {0}}}{1}"; // {0} 패킷 이름 // {1} 패킷 번호 p..

C# 2025.01.08

Packet Generator #2

이번 포스트에서는 패킷을 자동으로 생성하는 과정에서 패킷에 포함되어 있던구조체와, 구조체를 담은 자료구조까지 패킷에 포함시켜 생성해보도록 하겠습니다.기존의 코드에서 일부 변경사항이 추가되었고,마지막에는 기존의 세션에서 사용하던 패킷 코드를 자동 생성된 패킷으로 교체헤보도록 하겠습니다.염두할 변경사항으로는 기존의 StatInfo로 사용하던 구초제 이름을 Stat으로 변경한 것입니다. 1) PacketGeneratorclass Program{ static string genPackets; static void Main(string[] args) { XmlReaderSettings settings = new XmlReaderSettings() { I..

C# 2025.01.07

Packet Generator #1

이번 포스트부터 패킷 자동화를 수행하도록 하겠습니다.이때 패킷의 구조에 관한 서술은 xml과 같은 외부 파일에 정의하도록 하겠습니다. 1) 패킷 구조 XML  2) 패킷을 자동으로 생성하는 PacketGeneratorclass PacketGenerator{ void Main(string[] args) { XmlReaderSettings settings = new XmlReaderSettings() { IgnoreComments = true, IgnoreWhitespace = true, }; using (XmlReader reader = XmlReader.Create("PD..

C# 2025.01.07

직렬화(Serialization) 4

이번에는 패킷안에 스탯과 같은 구조체가 존재하고이 구조체의 인스턴스를 저장하는 자료구조가 있는 경우에Read와 Write를 수행할 수 있도록 코드를 수정해보겠습니다. 1) 패킷의 소스코드// 패킷의 인자를 설정하는 경우, 최대한 용량을 줄여주는 것이 좋음public abstract class Packet{ // 패킷의 용량 public ushort _packetSize; // 패킷의 아이디 public ushort _packetID; // 패킷을 읽고, 패킷에 쓰기 위한 함수 public abstract void Read(ArraySegment segment); public abstract ArraySegment Write();}class PlayerInfoRequi..

C# 2025.01.06

직렬화(Serialization) 3

이번 포스트에서는 기존의 Packet에서 Write와 Read에서 패킷을 채워주는 경우에매번 Span을 새로 생성하였는데, 이 부분을 개선하도록 하겠습니다.추가적으로 패킷에서 string 타입의 프로퍼티를 사용하고이를 인코딩하는 부분도 추가하도록 하겠습니다. 이때 string 프로퍼티를 쓰고 읽는 경우에문자열을 그대로 보내서 그때그때 필요한 배열을 할당하는 것이 아니라 우선 2바이트짜리 배열의 크기를 보내고 배열의 크기만큼 문자열을 저장할 배열을 만들어주도록 하겠습니다. 1) 서버와 클라이언트가 공통적으로 사용하는 패킷// 패킷의 인자를 설정하는 경우, 최대한 용량을 줄여주는 것이 좋음public abstract class Packet{ // 패킷의 용량 public ushort _packet..

C# 2025.01.06

UTF-8과 UTF-16

이번 포스트에서는 컴퓨터에서 언어를 다루는 방식을 알아보도록 하겠습니다. 1) ASCII 코드오직 영어만을 위해 사용가능한 방식인 ASCII 코드입니다.문자 하나를 255 크기의 1바이트(=8비트)로 표현합니다.예를 들어 대문자 A는 10진수로는 65, 16진수로는 0x41로 표현합니다. 2) UNICODEASCII 코드는 영어만을 표현할 수 있으므로 이를 위해 만들어진 UNICODE 입니다.영어 외의 다른 언어를 표현하기 위해 3바이트(=24비트)로 표현합니다.하지만 유니코드의 경우, 치명적인 단점이 존재하는데 바로 모든 문자들에 대해 3바이트라는 무시하지 못할 크기의 용량을 사용한다는 것입니다.따라서 이를 개선하고자 등장한 것이 바로 UTF-8과 UTF-16입니다. 3) UTF-8UTF-8의 경우 영..

C# 2025.01.06