PIDL
생성 및 셋팅
파일을 생성하는 방법은 간단합니다. Visual Studio에서 txt 파일로 파일을 생성하고, 확장자를 PIDL로 바꾼 후 컴파일을 위한 세팅을 해주시면 됩니다. 확장자가 PIDL인 파일들은 Custom Build 설정되어 있어야 합니다.
Visual Studio 솔루션 Viewer
생성한 PIDL 파일 우 클릭
속성 -> General -> Item Type: Custom Build Tool
PIDL 문법
PIDL은 아래와 같은 구조로 이루어져 있습니다.
컴파일을 하게 되면 namespace를 생성 후, Stub과 Proxy Class는 이 namespace 안에 들어가게 됩니다. 모든 RMI함수들은 고유ID를 갖게 되는데 이 값은 ‘메시지의 ID 첫 시작 값’ 으로부터 +1씩 추가되어 ID가 부여됩니다. 단, 0 ~ 1,300 사이의 ID와 63,000 이후의 ID는 ProudNet 내부 메시지로 사용하기 때문에 이 외의 번호를 사용해야 합니다.
생성된 Proxy & Stub 파일 사용법
PIDL을 실행하시면 아래와 같은 6개의 파일이 생성됩니다.
PIDL파일명_common.Cpp
PIDL파일명_common.h
PIDL파일명_proxy.Cpp
PIDL파일명_proxy.h
PIDL파일명_stub.Cpp
PIDL파일명_stub.h
C#의 경우 아래와 같은 3개의 파일이 생성됩니다.
PIDL파일명_common.cs
PIDL파일명_proxy.cs
PIDL파일명_stub.cs
common 파일을 제외한 각각 h파일은 header에, cpp파일은 cpp파일에 #include 해주면 편리합니다. .h파일과 .cpp 파일은 프로젝트에 포함시켜도 되지만, Custom Build 사용으로 인하여 파일 변경이 자주 일어나므로 주의합니다. 생성된 RMI 함수에는 정의한 변수 외에 두 가지 파라미터가 자동으로 추가됩니다.
- 클라이언트,서버에 Proxy 붙이기
PIDL 컴파일 결과물의 Proxy 인스턴스를 먼저 생성한 후 인스턴스를 Proud.CNetClient 나 Proud.CNetServer에 등록해야 합니다. 클라이언트와 서버는 Proud.IRmiHost 를 상속받았으며, 여기에 있는 메서드 AttachProxy 를 통해 proxy를 등록할 수 있습니다. 클라이언트나 서버 각각은 Proxy는 두개 이상을 붙여도 됩니다. 단, 메시지 ID의 범위가 겹치면 안됩니다.
C#의 경우도 마찬가지로 NetServer와 NetClient에 있는 AttachProxy 함수를 사용하시면 됩니다.
예를 들어, TestA.Proxy가 있고 TestB.Proxy를 한 개의 CNetClient에 붙인다고 가정했을때, 만약 TestA의 첫 메시지 ID를 2,100으로, TestB의 첫 메시지 ID를 2,200으로 선언했다면, TestA에 선언된 RMI 함수의 갯수가 200개인 경우 TestA에 배정되는 메시지 ID는 2,100~2,300이 되어TestB의 메시지 ID가 겹치게 됩니다. 붙이는 Proxy의 메시지 ID가 겹치게 될 경우 예외가 throw됩니다.
- 클라이언트,서버에 Stub 붙이기
PIDL 컴파일 결과물의 Stub 인스턴스는 네트워크로 수신된 메시지에 의해 실행될 RMI 함수들을 virtual function으로 갖고 있습니다. 개발 시에는 이 Stub 클래스를 상속받아 RMI 함수들을 오버라이드해야 합니다.
C#의 경우는 따로 오버라이드 없이 바로 Stub 객체를 생성하여 사용할 수 있습니다.
C++의 경우 PIDL 컴파일러는 개발자의 편의를 위해 RMI 함수 이름과 파라미터가 포장된 다음과 같은 형태의 매크로를 생성합니다.
- 매크로 사용 순서
클라이언트와 서버는 Proud.IRmiHost를 상속 받았으며, 여기에 있는 메서드 Proud.IRmiHost.AttachStub 을 통해 stub을 등록할 수 있습니다. Proxy와 마찬가지로 메시지 ID가 겹치지 않는 조건 하에 2개 이상의 Stub을 붙일 수 있습니다.
- 통신을 위한 Option Class
내부 Static으로 선언된 변수들을 사용하면 편리합니다.
C++ | C# | 설명 |
---|---|---|
Proud::HostID | Nettention.Proud.HostID | 통신하고자 하는 상대 Host의 ID값 |
Proud::RmiContext | Nettention.Proud.RmiContext | 보내거나 받기 위한 옵션 |
Reliable / Unreliable 통신명 | 설명 |
---|---|
ReliableSend | Reliable 통신 |
FastEncryptedReliableSend | 빠른 암호화 방식(보안성이 낮은)을 사용하는 Reliable통신 |
SecureReliableSend | 암호화된 Reliable통신 |
UnreliableSend | Unreliable 통신 |
FastEncryptedUnreliableSend | 빠른 암호화 방식(보안성이 낮은)을 사용하는 Unreliable 통신 |
SecureUnreliableSend | 암호화된 Unreliable 통신 |
많이 사용하는 Option 은 Static으로 미리 만들어져 있습니다. 사용자 편의에 따라 직접 생성하여 원하시는 Option을 정할 수 있습니다.
m_reliability: Reliable & Unreliable 통신 방식 선택 m_encryptMode: 암호화 여부(속도와 보안성에 따라 세가지 Option 선택이 가능합니다.) m_compressMode: 압축 여부
C#의 경우 같은 이름으로 정의되어 있는 변수를 사용합니다.
활용
PIDL 활용법Last updated