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으로 선언된 변수들을 사용하면 편리합니다.
Proud::HostID
Nettention.Proud.HostID
통신하고자 하는 상대 Host의 ID값
Proud::RmiContext
Nettention.Proud.RmiContext
보내거나 받기 위한 옵션
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