コード例 #1
0
    void AsioSessionState::onAccept(
        const boost::system::error_code& error)
    {
        RCF2_TRACE("")(this);

        if (mTransport.mStopFlag)
        {
            return;
        }

        if (!error)
        {
            // save the remote address in the SessionState object
            bool clientAddrAllowed = implOnAccept();
            mState = WritingData;

            // create a new SessionState, and do an accept on that
            mTransport.createSessionState()->invokeAsyncAccept();

            // set current RCF session
            SetCurrentSessionGuard guard(mSessionPtr);

            if (clientAddrAllowed)
            {
                // Check the connection limit.
                bool allowConnect = true;
                std::size_t connectionLimit = mTransport.getConnectionLimit();
                if (connectionLimit)
                {
                    Lock lock(mTransport.mSessionsMutex);
                    
                    RCF_ASSERT(
                        mTransport.mSessions.size() <= 1 + 1 + connectionLimit);

                    if (mTransport.mSessions.size() == 1 + 1 + connectionLimit)
                    {
                        allowConnect = false;
                    }
                }

                if (allowConnect)
                {
                    // start things rolling by faking a completed write operation
                    onReadWrite(0, boost::system::error_code());
                }
                else
                {
                    sendServerError(RcfError_ConnectionLimitExceeded);
                }
            }
        }
        else if (
            error == boost::asio::error::connection_aborted ||
            error == boost::asio::error::operation_aborted)
        {
            invokeAsyncAccept();
        }
    }
コード例 #2
0
void AsioSessionState::onAcceptCompleted(
    const AsioErrorCode & error)
{
    RCF_LOG_4()(error.value())
            << "AsioSessionState - onAccept().";

    if (mTransport.mStopFlag)
    {
        RCF_LOG_4()(error.value())
                << "AsioSessionState - onAccept(). Returning early, stop flag is set.";

        return;
    }

    //if (
    //    error == ASIO_NS::error::connection_aborted ||
    //    error == ASIO_NS::error::operation_aborted)
    //{
    //    beginAccept();
    //    return;
    //}

    // create a new SessionState, and do an accept on that
    mTransport.createSessionState()->beginAccept();

    if (!error)
    {
        // save the remote address in the SessionState object
        bool clientAddrAllowed = implOnAccept();
        mState = WritingData;

        // set current RCF session
        CurrentRcfSessionSentry guard(*mSessionPtr);

        mSessionPtr->touch();

        if (clientAddrAllowed)
        {
            // Check the connection limit.
            bool allowConnect = true;
            std::size_t connectionLimit = mTransport.getConnectionLimit();
            if (connectionLimit)
            {
                Lock lock(mTransport.mSessionsMutex);

                RCF_ASSERT_LTEQ(
                    mTransport.mSessions.size() , 1+1+connectionLimit);

                if (mTransport.mSessions.size() == 1+1+connectionLimit)
                {
                    allowConnect = false;
                }
            }

            if (allowConnect)
            {
                time_t now = 0;
                now = time(NULL);
                mSessionPtr->setConnectedAtTime(now);

                // start things rolling by faking a completed write operation
                onAppReadWriteCompleted(0);
            }
            else
            {
                sendServerError(RcfError_ConnectionLimitExceeded);
            }
        }
    }
}