Ejemplo n.º 1
0
void ASE::DoPulse ( void )
{
    if ( m_Socket == INVALID_SOCKET )
        return;

    sockaddr_in SockAddr;
#ifndef WIN32
    socklen_t nLen = sizeof ( sockaddr );
#else
    int nLen = sizeof ( sockaddr );
#endif

    m_llCurrentTime = GetTickCount64_ ();
    m_uiCurrentPlayerCount = m_pPlayerManager->Count ();

    for ( uint i = 0 ; i < 100 ; i++ )
    {
        char szBuffer[2];

        // We set the socket to non-blocking so we can just keep reading
        int iBuffer = recvfrom ( m_Socket, szBuffer, 1, 0, (sockaddr*)&SockAddr, &nLen );
        if ( iBuffer < 1 )
            break;

        m_uiNumQueriesTotal++;

        if ( m_QueryDosProtect.GetTotalFloodingCount () < 100 )
            if ( m_QueryDosProtect.AddConnect ( inet_ntoa ( SockAddr.sin_addr ) ) )
                continue;

        const std::string* strReply = NULL;

        switch ( szBuffer[0] )
        {
            case 's':
            { // ASE protocol query
                m_ulMasterServerQueryCount++;
                strReply = QueryFullCached ();
                break;
            }
            case 'b':
            { // Our own lighter query for ingame browser
                strReply = QueryLightCached ();
                break;
            }
            case 'r':
            { // Our own lighter query for ingame browser - Release version only
                strReply = QueryLightCached ();
                break;
            }
            case 'x':
            { // Our own lighter query for xfire updates
                strReply = QueryXfireLightCached ();
                break;
            }
            case 'v':
            { // MTA Version (For further possibilities to quick ping, in case we do multiply master servers)
                strReply = &m_strMtaAseVersion;
                break;
            }
        }

        // If our reply buffer isn't empty, send it
        if ( strReply && !strReply->empty() )
        {
            /*int sent =*/ sendto ( m_Socket,
                                strReply->c_str(),
                                strReply->length(),
                                0,
                                (sockaddr*)&SockAddr,
                                nLen );
        }
    }

    // Update stats
    if ( m_MinuteTimer.Get () >= 60000 )
    {
        m_MinuteTimer.Reset ();
        m_uiNumQueriesPerMinute = m_uiNumQueriesTotal - m_uiTotalAtMinuteStart;
        m_uiTotalAtMinuteStart = m_uiNumQueriesTotal;
    }
}
Ejemplo n.º 2
0
void ASE::DoPulse ( void )
{
    sockaddr_in SockAddr;
#ifndef WIN32
    socklen_t nLen = sizeof ( sockaddr );
#else
    int nLen = sizeof ( sockaddr );
#endif

    char szBuffer[2];
    int iBuffer = 0;

    // We set the socket to non-blocking so we can just keep reading
    iBuffer = recvfrom ( m_Socket, szBuffer, 1, 0, (sockaddr*)&SockAddr, &nLen );
    if ( iBuffer > 0 )
    {
        std::string strReply;

        switch ( szBuffer[0] )
        {
            case 's':
            { // ASE protocol query
                m_ulMasterServerQueryCount++;
                strReply = QueryFullCached ();
                break;
            }
            case 'b':
            { // Our own lighter query for ingame browser
                strReply = QueryLightCached ();
                break;
            }
            case 'r':
            { // Our own lighter query for ingame browser - Release version only
                strReply = QueryLightCached ();
                break;
            }
            case 'x':
            { // Our own lighter query for xfire updates
                strReply = QueryXfireLightCached ();
                break;
            }
            case 'v':
            { // MTA Version (For further possibilities to quick ping, in case we do multiply master servers)
                strReply = MTA_DM_ASE_VERSION;
                break;
            }
            default:
                return;
        }

        // If our reply buffer isn't empty, send it
        if ( !strReply.empty() )
        {
            /*int sent =*/ sendto ( m_Socket,
                                strReply.c_str(),
                                strReply.length(),
                                0,
                                (sockaddr*)&SockAddr,
                                nLen );
        }
    }
}