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