개인공부) 서버실습(40) - Packet Generator(6)

Justin·2022년 7월 8일
0

서버공부

목록 보기
39/45
post-custom-banner

✅ 지난 시간

서버의 Client Session 영역에서 패킷을 받을 때 패킷 종류에 따라 하는 처리가 달라지기에 Swtich문으로 구분을하였는데

패킷의 종류가 늘어날수록 비효율적인 구조가 되기에 그 방법을 해당 패킷에 맞게 제작해주는 구조로 변경하였다.

🌐 PacketManager 자동화

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

📑 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 영역에 PacektHandler 항목을 추가 생성하고, 내용을 복붙 해준다.

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

왜 PacketHandler는 자동화를 하지 않을까?
이 부분은 패킷을 가져와서 그 패킷으로 뭘 할지 처리를 해주던 부분이다. (*기존에는 skill을 가져와서 출력함) 그렇기에 패킷 마다 해줄 작업이 달라 자동화를 하지 않는 것 같다.


❗ Packet의 문제점

지금까지 Packet Manager 자동화 처리를 해주었는데 여기서는 발생할 수 있는 문제가 있다.

패킷의 종류에 따라 서버 끼리 통신하는 패킷이 있고, 클라-서버 사이에 통신하는 패킷이 있을 텐데

악의적인 상황으로 인해 서버와 서버 사이에 통신하는 패킷의 이름으로 접근하는 경우가 생길경우 위험한 상황이 펼처질 수 있다.

그래서 패킷 별로 클라와 통신을 위한 것인지, 서버 끼리 통신을 위한 것인지에 대한 내용을 정의 해주고 그에 따라 제한 사항을 두는 방식을 활용할 수 있다.

👱‍♂️ 간단하게 구분하기

PDL 파일에서 name 이외에 usage같은 항목으로 구분을 할 수도 있지만, 더 간단하게 이름으로 구분하는 방식을 사용해보자.

클라와 통신이라면, 클라에서 서버 쪽으로 S_서버에서 클라라고 구분을 하자

🔸 PacketGenerator 수정

위에서 생성해주었던 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을 처리하고, 자동화하는 부분의 끝이다. 새로 접하는 개념도 있고 규모가 큰 편이다 보니 아직 헷갈리는 부분이 굉장히 많다.

여러번 반복해보며 내것으로 만들어봐야지

profile
인디 게임을 만들며 공부하고 있습니다.
post-custom-banner

0개의 댓글