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(); } }
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); } } } }