8.How to handle events

서버와 클라이언트는 모두 이벤트 핸들링을 합니다. Proud의 이벤트 핸들링은 delegate 패턴으로 되어 있습니다.

이벤트 핸들링을 하려면 클라이언트에서는 Proud.INetClientEvent 클래스를 상속받아 구현해야 합니다. 서버에서는 Proud.INetServerEvent 클래스를 상속받아 구현해야 합니다. 두 클래스는 Proud.INetCoreEvent 클래스를 상속받고 있습니다. 이것 또한 구현해야 합니다.

그리고 나서 구현한 클래스의 인스턴스를 만든 후 그것을 서버에서는 Proud.CNetServer.SetEventSink로, 클라이언트에서는 Proud.CNetClient.SetEventSink를 통해 연계해줘야 합니다.

class MyEvent:public INetClientEvent
{
    virtual void OnJoinServerComplete(...) override 
    { 
        // my event handler
        ...
    }
}

MyEvent m_myEvent;
myNetServer->SetEventSink(&m_myEvent);

C++11을 지원하는 컴파일러를 쓰신다면, 위에처럼 클래스를 상속받는 방법 대신 람다식을 쓰시면 좋습니다. 더 간결한 프로그래밍을 하실 수 있습니다.

myNetServer->OnJoinServerComplete = [...](...) 
    {
        // my event handler
        ...
    };

위 과정을 통해 이벤트 콜백을 받을 수 있는 시점에 대해서는 10. Understanding server main loop 9. Understanding client main loop를 참고하십시오.

그림 8-1클라이언트에서 이벤트 핸들러를 연계시키기

서버에서 발생할 수 있는 대표적인 이벤트는 '클라이언트로부터의 연결 받기' 등이 있고, 클라이언트에서 발생하는 대표적인 이벤트는 '서버와의 연결 성사', 'P2P 멤버의 참여' 등이 있습니다.

팁 : Event에 대한 Log처리는 필수 입니다.


기술지원 중 가장 많이 발생하는 문제는 Log처리를 잘 하지 않아 원인을 발견하지 못하는 데에 있습니다. 특히 errorInfo가 parameter로 들어가는 함수들과 아래의 Event는 반드시 Log처리를 해주십시오.


  • OnError: ProuNet내부에서 발생되는 Error나 사용중의 문제로 인한 정보를 Callback해줍니다.

  • OnWarning: 심각하진 않으나 잠재적 문제성을 가지고 있는 정보를 Callback해줍니다.

  • OnInformation: 내부 상황 & 추적 등에 대한 정보를 Callback시켜 줍니다.

  • OnException: 내부 Exception 오류 정보를 Callback시켜 줍니다.


Parameter인 errorInfo의 errorInfo->ToString();을 사용하시면 쉽게 문제에 대한 정보를 얻으실 수 있습니다.