Deep Studying

[프라우드넷] RPC 통신 이해하기(2) - PIDL 파일에 대해 본문

게임서버

[프라우드넷] RPC 통신 이해하기(2) - PIDL 파일에 대해

miniSeop 2022. 1. 9. 17:43

지난 포스트에서는 프라우드넷이 RMI라는 방식을 통해 통신한다는 것을 알았습니다. 구체적으로 프로젝트에서는 어떻게 구성되어있는지 알아보겠습니다.

 

이전 포스트: RPC 통신 이해하기(1) - 용어 및 개념 정의

 

 

 

처음 포스트에서 열어보았던 SimpleCSharp 예제의 구조입니다.

 우선 차근 차근 설명하겠지만 RMI란 폴더에 있는 common, proxy, stub 세 가지 파일의 존재를 기억하고 설명을 들으시면 좋을 것 같습니다.

 

 

PIDL 파일

Simple.PIDL 파일을 열어보면 다음과 같은 내용이 적혀있습니다.

// P2P RMI function definitions.

global Simple 2000 // client-to-client RMI, first message ID = 2000
{
	// Example that send chatting message to server
	Chat([in] String a,[in] int b,[in] float c);
	ShowChat([in] String a,[in]int b,[in]float c);
	SystemChat([in] String txt);

	P2PChat([in] String a,[in] int b, [in] float c);
}

 

사용할 수 있는 메서드들과 넣어주어야하는 파라미터들이 정의되있는 것을 확인할 수 있습니다.

 

ProudNet Documentation - Remote Method Invocation 사용방법

PIDL 파일의 문법에 대해서는 제가 설명드리기보단 위 링크에서 자세히 확인할 수 있습니다.

 

Common 프로젝트를 빌드하면 Simple.PIDL 파일도 자신의 규칙에 맞게 빌드됩니다.

Simple.PIDL 우클릭 -> 속성 ( Properties ) 에서 확인하시면

 

 

( 명령줄 ) 다음과 같이 PIDL.exe라는 프로그램을 실행시켜서

( 출력 ) Simple_proxy.cs, Simple_stub.cs, Simple_common.cs 라는 파일을 만들어냄을 알 수 있습니다.

 

Stub.cs 파일

Simple_stub.cs 코드입니다.

internal class Stub:Nettention.Proud.RmiStub
	{
        ...
        
		public delegate bool ChatDelegate(Nettention.Proud.HostID remote,Nettention.Proud.RmiContext rmiContext, String a, int b, float c);  
		public ChatDelegate Chat = delegate(Nettention.Proud.HostID remote,Nettention.Proud.RmiContext rmiContext, String a, int b, float c)
		{ 
			return false;
		};
        
        ...
        
    }

 

코드의 자세한 내용은 당장 확인하지 않더라도 Stub.Chat에 Default 값이 되는 delegate를 생성해서 붙이고 있습니다.

 

 

SimpleCSharpServer 프로젝트의 Program.cs를 열어봅시다.

static void InitStub()
{
        g_Stub.Chat = (Nettention.Proud.HostID remote, Nettention.Proud.RmiContext rmiContext, String a, int b, float c) =>
        {
              Console.Write("[Server] chat message received :");
              Console.Write(" a={0} b={1} c={2}\n", a, b, c);

              // Echo chatting message which received from server to client.
              g_Proxy.ShowChat(remote, RmiContext.ReliableSend, a, b + 1, c + 1);

              return true;
        };
}

여기서는 Stub.Chat에 다시 새로운 함수를 정의하여 연결하는 것을 볼 수 있습니다.

 

 즉, Simple.PIDL파일이 만들어낸 Simple_stub.cs는 메서드를 먼저 선언해놓고 클라이언트가 실행할 때 오류가 나면 안되니 아무 동작하지 않은 로직을 먼저 붙여둡니다.

 서버에서는 프로그램의 Init 단계에서 이를 적절하게 재정의하여 의미 있는 통신으로 만드는 것입니다.

 

Proxy.cs 파일

저번 포스트에서 열어봤던 Simple_proxy.cs 파일입니다.

public bool Chat(Nettention.Proud.HostID remote,Nettention.Proud.RmiContext rmiContext, String a, int b, float c)
{
	// 1. Message 객체 생성
	Nettention.Proud.Message __msg=new Nettention.Proud.Message();
	__msg.SimplePacketMode = core.IsSimplePacketMode();
    
	// 2. Message의 call type 정하기.
	Nettention.Proud.RmiID __msgid= Common.Chat;
	__msg.Write(__msgid);
    
	// 3. Marshalling
	Nettention.Proud.Marshaler.Write(__msg, a);
	Nettention.Proud.Marshaler.Write(__msg, b);
	Nettention.Proud.Marshaler.Write(__msg, c);
	
	// 4. 호출하는 호스트의 정보를 넣는다.
	Nettention.Proud.HostID[] __list = new Nettention.Proud.HostID[1];
	__list[0] = remote;
	
	// 5. 전송한다.
	return RmiSend(__list,rmiContext,__msg,
		RmiName_Chat, Common.Chat);
}

 

지난 포스트에서 설명했기 때문에 자세한 설명은 넘어가겠습니다.

 

 

 코드를 작성해보기 전에 필요한 내용들은 얼추 정리가 된 것 같으니 다음 포스트에서부터는 코드를 작성하여 실제 서버와 클라이언트를 구성해보도록 하겠습니다.

 

 

다음 포스트: 채팅서버 만들기(1) 프로젝트 초기 설정하기