4.과거의 송수신 처리 방식을 유지하기

과거의 송수신 처리 방식(4.1 RMI를 사용하지 않을 경우의 프로그램의 예)으로 만들어진 프로그램 ProudNet을 도입할 때, 웬만하면 RMI를 쓰는 방식으로 바꾸는 것을 권장합니다. 추후 개발도 편하지만 RMI로 만들 경우 프로그래머가 송수신 루틴을 잘못 만드는 실수를 원천 봉쇄하기 때문입니다.

하지만 과거의 송수신 처리 방식을 굳이 필요한 경우를 위해 ProudNet은 대안을 제시하고 있습니다.

4.1RMI를 전혀 안쓰고 사용자 정의 메시지를 주고 받기

4. Remote Method Invocation (원격 메서드 호출)을 안쓰고 사용자가 정의한 메시지를 송신하기는 다음 함수로 가능합니다.

Proud.CNetClient.SendUserMessage

Proud.CNetServer.SendUserMessage

• Proud.CLanClient.SendUserMessage

• Proud.CLanServer.SendUserMessage

사용자가 정의한 메시지의 수신은 다음 함수로 콜백됩니다.

Proud.INetClientEvent.OnReceiveUserMessage

Proud.INetServerEvent.OnReceiveUserMessage

• Proud.ILanClientEvent.OnReceiveUserMessage

• Proud.ILanServerEvent.OnReceiveUserMessage

4.2RMI의 파라메터로 사용자 정의 메시지를 주고 받기

ProudNet에서는 Proud.ByteArray 타입을 RMI의 파라메터로 다음과 같이 사용할 수 있습니다. 즉 메모리 블럭을 RMI의 파라메터로 주고 받는 것이 가능합니다.

Foo([in] Proud::ByteArray something);

이를 활용해서 과거의 송수신 처리 루틴을 사용할 수 있습니다.

• 메시지 송신시: 과거의 메시지 송신 루틴에서 만들어진 버퍼 객체를 Proud.ByteArray 객체에 넣습니다. 그리고 나서 Proud.ByteArray 객체를 RMI의 파라메터로 전송합니다. 아래는 그 예입니다.

// 메시지 객체 생성
Proud::CMessage msg;

/* 사용자가 직접 만든 msg 객체는 아직 어떤 버퍼를 써야 할지 지정되지 않았습니다.
이러한 경우 UseInternalBuffer를 호출해야만 << 연산자가 작동합니다.
UseInternalBuffer는 msg 객체에 아무것도 버퍼 사용이 지정되지 않음을 전제합니다.
따라서 이미 버퍼 사용이 지정된 경우 이 메서드를 호출해서는 안됩니다.
자세한 것은 Proud.CMessage.UseInternalBuffer 도움말을 참고하십시오. */
msg.UseInternalBuffer();

msg << a << b;

Proud::ByteArray block;
block.SetCount(msg.GetLength());
memcpy(block.GetData(), msg.GetData(), block.Count);

Foo(Proud::HostID_Server, Proud::RmiContext::ReliableSend, block);

• 메시지 수신시 : 개발자가 구현하는 RMI 함수 내부에서 Proud.ByteArray 객체를 RMI 파라메터로 받은 다음, 그것으로부터 필요한 데이터를 추출합니다.아래는 그 예입니다.

DEFRMI_MyPIDL_Foo(MyClass)
{
    // Parameter 'block' and the others are is given
    Proud::CMessage msg;
    msg.UseExternalBuffer(block.GetData(), block.Count);
    msg.SetLength(block.Count);
    msg >> a >> b;
    ...
}