서버의 Client Session 영역에서 패킷을 받을 때 패킷 종류에 따라 하는 처리가 달라지기에 Swtich문으로 구분을하였는데
패킷의 종류가 늘어날수록 비효율적인 구조가 되기에 그 방법을 해당 패킷에 맞게 제작해주는 구조로 변경하였다.
이제 지난시간에 제작한 구조를 자동화 코드로 변경하고자 한다.
자동화를 위해 PacketFormat에 managerFormat을 선언하고, 기존에 하던 작업들을 가져온다.
여기서 Register의 부분은 어떤 패킷이냐에 따라 처리 방식이 다르기에 {0} 으로 설정해 추후 데이터를 넣는다.
추가로 managerRegisterFormat을 선언하여 Register 부분에서 자동화가 필요한 부분을 {0}으로 구멍을 내준다.
managerRegisterFormat 값이 ManagerFormat의 구멍을 매워주도록 처리할 것이다.
static string managerRegister;
기존에 자동화를 진행했던 것 처럼 stringFormat()
을 활용하여 managerFormat 타입에 {0} 구멍에 managerRegister를 담는다.
위에서 선언한 managerRegister의 내용을 채워주기 위해 이번엔 managerRegister
형식에 패킷의 이름을 추가해준다.
managerRegister +=
string.Format(PacketFormat.managerRegister
Format, packetName)
+ Environment.NewLine;
새로 생성한 PacketManager를 각 폴더에 담아주면 된다.
단, 이렇게 했을 때 PacketManager 중 일부가 PacketHandler를 참조 하고 있기에 Client 영역에 PacektHandler 항목을 추가 생성하고, 내용을 복붙 해준다.
이제 만약 PDL에서 패킷 내용이 추가되어야 한다면, PacketHandler에서도 그 패킷을 처리하는 방식이 추가되어야한다.
왜 PacketHandler는 자동화를 하지 않을까?
이 부분은 패킷을 가져와서 그 패킷으로 뭘 할지 처리를 해주던 부분이다. (*기존에는 skill을 가져와서 출력함) 그렇기에 패킷 마다 해줄 작업이 달라 자동화를 하지 않는 것 같다.
지금까지 Packet Manager 자동화 처리를 해주었는데 여기서는 발생할 수 있는 문제가 있다.
패킷의 종류에 따라 서버 끼리 통신하는 패킷이 있고, 클라-서버 사이에 통신하는 패킷이 있을 텐데
악의적인 상황으로 인해 서버와 서버 사이에 통신하는 패킷의 이름으로 접근하는 경우가 생길경우 위험한 상황이 펼처질 수 있다.
그래서 패킷 별로 클라와 통신을 위한 것인지, 서버 끼리 통신을 위한 것인지에 대한 내용을 정의 해주고 그에 따라 제한 사항을 두는 방식을 활용할 수 있다.
PDL 파일에서 name 이외에 usage같은 항목으로 구분을 할 수도 있지만, 더 간단하게 이름으로 구분하는 방식을 사용해보자.
클라와 통신이라면, 클라에서 서버 쪽으로 S_서버에서 클라라고 구분을 하자
위에서 생성해주었던 PacketGenerator 내용을 약간 수정하면 되는데 managerRegister
가 아니라 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);
여기서는 S시작하는건 서버에서 클라이기에 ClientRegister에 내용을 담아주는 것이고, C 가 서버에서 처리를 해주어야하는 내용이기에 serverRegister로 넣어준다.
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;
이 부분에서 서로 반대로 넣어서 한참을 고생했다..
다음으로 배치 파일도 하나의 파일을 가진 것이아닌 각 파일 별로 폴더 위치를 구분하여 잘 담아준다.
새로 빌드 후 bat 파일을 다시 가서 PacketHandler에 부분들만 각각 생성된 패킷에 맞춰서 정의를 해준 뒤에
client와 server 패킷만 실행시키면 다시 잘 동작하는 것을 확인할 수 있다.
여기까지가 이제 Packet을 처리하고, 자동화하는 부분의 끝이다. 새로 접하는 개념도 있고 규모가 큰 편이다 보니 아직 헷갈리는 부분이 굉장히 많다.
여러번 반복해보며 내것으로 만들어봐야지