공부/인프런 - Rookiss

Part 4-4-11. 패킷 직렬화 : Packet Generator #6

셩잇님 2023. 12. 22. 17:16
반응형

 

 

패킷 직렬화

 

 지난 시간에는 ClientSession 에서 패킷을 받을 때 패킷 종류에 따라 처리를 달리 하는 방식을 Switch 문으로 처리하였지만, 시간이 지나면서 패킷의 종류가 늘어날수록 비효율적인 구조가 되기에 이를 패킷의 형식에 맞게 처리해주는 구조로 변경해주었다.

 


 

🩺 Packet Manager 자동화

 

 이제 지난 시간에 제작한 구조들을 자동화 코드로 변경하고자 한다.

 

📿 ManagerFormat 추가

 

 자동화를 위해 PacketFormat에 managerFormat을 선언하고, 기존에 작업하던 코드들을 가져온다.

 

 

 여기서 Register의 부분은 어떠한 패킷이냐에 따라 처리 방식이 다르기에 {0}으로 선언하여 설정한 후, 추후 데이터를 넣는 방식으로 접근한다.

 

📿 managerRegisterFormat 추가

 

 추가로 managerRegisterFormat을 선언하여 Register 부분에서 자동화가 필요한 부분을 {0}으로 작성해준다.

 

 

 위와 같이 작성한다면 managerRegisterFormat 값이 ManagerFormat의 구멍을 매워주도록 처리할 것이다.

 

📿 PacketManager 새롭게 생성

 

static string managerRegister;

 

 기존에 자동화를 진행했던 것처럼 stringFormat()을 활용하여 managerFormat 타입 {0}에 맞도록 managerRegister를 담아서 사용한다.

 

 

📿 ParsePacket 추가

 

 위에서 선언한 managerRegister의 내용을 채워주기 위해 이번에는 managerRegister 형식에 패킷의 이름을 추가해준다.

 

managerRegister += string.Format(PacketFormat.managerRegister Format, packetName) + Environment.NewLine;

 

📿 배치 파일 재생성

 

 새로 생성한 PacketManager를 각 폴더에 담아주도록 한다.

 

 

 단, 위와 같이 작업을 했을 때 PacketManager 중 일부가 PacketHandler를 참조하고 있기 때문에 Client 영역에도 PacketHandler 항목을 새롭게 추가 생성하고, 내용을 복사, 붙여넣기 해준다.

 

 

 

 이제 PDL에서 패킷 내용이 추가되어야 한다면, PacketHandler 에서도 해당 패킷을 처리하는 방식이 추가되어야 한다.

 


 

❗ 현 Packet의 문제점

 

 지금까지 Packet Manager 자동화 처리를 해주었는데, 여기서 문제가 발생할 수 있다. 바로 패킷 통신 종류의 따른 문제이다. 패킷의 종류에는 A 서버와 B 서버 즉 서버끼리 통신하는 패킷이 있을테이고, 클라이언트 - 서버 사이에 통신하는 패킷으로 나누어 질 것이다.

 

 

 그렇지만 특저 유저가 악의적으로 서버끼리 통신하는 패킷 사이에 임의적으로 접근하는 경우가 생길경우 문제가 될 수 있다.

 

 

 이로 인해 패킷별로 클라이언트와 서버의 통신인지, 서버와 서버의 통신인지를 구분하는 내용을 추가해주고 이에 따라 제한 사항을 두는 방식으로 활용해보자.

 

 

📿 네이밍 규칙을 활용한 처리

 

 PDL 파일에 name을 작성하는 영역에 usage와 같은 방법으로 처리할 수 있지만, 보다 간단한 방법으로 이름으로 이를 구분하여 사용하는 방법을 택해보자.

 

 

 S를 시작하는 것은 서버 → 클라이언트이며, C로 시작하는 것이 서버에서 처리를 하는 내용이다.

 

📿 PacketGenerator 수정

 

 위에서 생성해주었던 PacketGenerator의 내용을 약간 수정해주어여 한다. 왜냐하면 server, client 용을 따로 구분해주기 시작했기 때문이다.

 

선언

 

static string serverRegister;
static string clientRegister;

 

파일 제작

 파일을 만들 때에도 client와 server를 따로 제작하여 구분해준다.

 

string clientManagerText = string.Format(PacketFormat.managerFormat, clientRegister);
File.WriteAllText("ClientPacketManager.cs", clientManagerText);
string serverManagerText = string.Format(PacketFormat.managerFormat, serverRegister);
File.WriteAllText("ServerPacketManager.cs", serverManagerText);

 

패킷 내용 생성

 

if (packetName.StartsWith("S_") || packetName.StartsWith("s_"))
   clientRegister += string.Format(PacketFormat.managerRegisterFormat, packetName) + Environment.NewLine;

else if (packetName.StartsWith("C_") || packetName.StartsWith("c_"))
   serverRegister += string.Format(PacketFormat.managerRegisterFormat, packetName) + Environment.NewLine;

 

배치파일 수정

 

 마지막으로 배치 파일도 하나의 파일을 통해 관리하는 것이 아닌 server, client으로 구분지어 각 파일 별로 처리하여 담당한다.

 

 

테스트

 

 새로 빌드한 후에 bat 파일을 다시 가서 PacketHandler의 의해 새롭게 생성된 패킷에 맞춰서 정의 해준 뒤, 다시 실행한다면 정상적으로 잘 동작하는 것을 확인할 수 있다.

 

 


 

 

 드디어 Packet 자동화가 끝이 났다. 회사에서 매일 하나의 한 강의씩 듣고 있는데 이번 챕터가 유독 길게 느껴졌다. 😢

 

 

반응형