Suspend accepting in ACE_Asynch_Acceptor Programming

게임 서비스를 하다보면 잠시동안 더 이상 접속을 받지 않는 기능이 필요할때가 있습니다. 동시접속자 한계치에 근접했다거나, 임시점검을 해야 할 때 기존에 접속되어 있는 유저는 그대로 두고 접속만 허용을 하지 않는 기능이 필요합니다.

ACE_Asynch_Acceptor에는 cancel 메소드로 이 기능을 수행할 수 있습니다만, 아쉽게도 windows에서는 치명적인 제한이 있습니다. open 메소드를 부른 스레드에서만 cancel 메소드를 불러야 정상적인 동작이 가능하다는 것 입니다. 찾아보니 reissue_accept() 와 accept() 메소드로도 control이 가능하다고 하는데, 직접 해보니 안되더군요. 그래서 콜백 메소드인 validate_connection() 를 이용해서 구현했습니다. validate_connection()는 새로 접속이 들어오면 불리는 콜백인데, 여기서 -1을 리턴해주면 접속을 허용하지 않습니다.(접속을 허용하지 않는다기 보다는 바로 접속종료를 시킨다는 표현이 정확하겠네요)

class CustomAsynchAcceptor : public ACE_Asynch_Acceptor<ProactorService>
{
public:
    CustomAsynchAcceptor() : _accept(true)
    {}

    int validate_connection (const ACE_Asynch_Accept::Result& result,
                                            const ACE_INET_Addr &remote,
                                            const ACE_INET_Addr& local)
    {
        if (false == _accept.value())
            return -1;

        ...
        return 0;
    }
public:
    void Suspend()
    {
        _accept = false;
    }
    void Resume()
    {
        _accept = true;
    }

private:
    ACE_Atomic_Op<ACE_Thread_Mutex, bool>    _accept;
};

HalfNetwork 에서는 아래와 같이 하시면 됩니다.
NetworkFacadeInstance->SuspendAcceptor(port);
NetworkFacadeInstance->ResumeAcceptor(port);

덧글

  • jacking 2009/02/12 11:20 # 답글

    빨리 구현되었군요^^
  • 자바워크 2009/02/13 23:00 #

    사용자의 요청에 빠르게 반응하는 라이브러리 개발자 Javawork 입니다. (사실은 백수 상태라... --)> )
  • 腕時計 ポリス 2013/08/21 15:36 # 삭제 답글

    Virkelig lækre, god pasform og de fine hæl er bare prikken over i'et.도움말]
  • ポリス 時計 2013/08/26 03:14 # 삭제 답글

    Sure. I believe you are suitable! I see that this is actually very good these days!도움말]
댓글 입력 영역