서버와 클라이언트는 모두 이벤트 핸들링을 합니다. 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를 참고하십시오.
서버에서 발생할 수 있는 대표적인 이벤트는 '클라이언트로부터의 연결 받기' 등이 있고, 클라이언트에서 발생하는 대표적인 이벤트는 '서버와의 연결 성사', 'P2P 멤버의 참여' 등이 있습니다.
팁 : Event에 대한 Log처리는 필수 입니다.
기술지원 중 가장 많이 발생하는 문제는 Log처리를 잘 하지 않아 원인을 발견하지 못하는 데에 있습니다. 특히 errorInfo가 parameter로 들어가는 함수들과 아래의 Event는 반드시 Log처리를 해주십시오.
OnError: ProuNet내부에서 발생되는 Error나 사용중의 문제로 인한 정보를 Callback해줍니다.
OnWarning: 심각하진 않으나 잠재적 문제성을 가지고 있는 정보를 Callback해줍니다.
OnInformation: 내부 상황 & 추적 등에 대한 정보를 Callback시켜 줍니다.
OnException: 내부 Exception 오류 정보를 Callback시켜 줍니다.
Parameter인 errorInfo의 errorInfo->ToString();을 사용하시면 쉽게 문제에 대한 정보를 얻으실 수 있습니다.