Esempio n. 1
0
// UDP packet received
BOOL CEDClients::OnUDP(SOCKADDR_IN* pHost, CEDPacket* pPacket)
{
	CSingleLock pLock( &Transfers.m_pSection );
	
	switch ( pPacket->m_nType )
	{
	case ED2K_C2C_UDP_REASKFILEPING:
		if ( ! pLock.Lock( 100 ) ) return FALSE;
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );
			
			if ( ! pClient->OnUdpReask( pPacket ) )
			{
				Datagrams.Send( pHost, CEDPacket::New( ED2K_C2C_UDP_FILENOTFOUND, ED2K_PROTOCOL_EMULE ) );
			}
		}
		else
		{
			Datagrams.Send( pHost, CEDPacket::New( ED2K_C2C_UDP_FILENOTFOUND, ED2K_PROTOCOL_EMULE ) );
		}
		break;
	case ED2K_C2C_UDP_REASKACK:
		if ( ! pLock.Lock( 100 ) ) return FALSE;
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );
			pClient->OnUdpReaskAck( pPacket );
		}
		break;
	case ED2K_C2C_UDP_QUEUEFULL:
		if ( ! pLock.Lock( 100 ) ) return FALSE;
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );
			pClient->OnUdpQueueFull( pPacket );
		}
		break;
	case ED2K_C2C_UDP_FILENOTFOUND:
		if ( ! pLock.Lock( 100 ) ) return FALSE;
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );
			pClient->OnUdpFileNotFound( pPacket );
		}
		break;
	case ED2K_S2CG_SERVERSTATUS:
		OnServerStatus( pHost, pPacket );
		break;
	case ED2K_S2CG_SEARCHRESULT:
	case ED2K_S2CG_FOUNDSOURCES:
		// Correct port value. (UDP port is TCP port + 4)
		pHost->sin_port = htons( ntohs( pHost->sin_port ) - 4 );

		// Check server details in host cache
		CHostCacheHost *pServer;
		DWORD nServerFlags = Settings.eDonkey.DefaultServerFlags;
		pServer = HostCache.eDonkey.Find( &pHost->sin_addr );
		if ( pServer && pServer->m_nUDPFlags )
		{
			nServerFlags = pServer->m_nUDPFlags;
		}

		// Decode packet and create hits
		if ( CQueryHit* pHits = CQueryHit::FromPacket( pPacket, pHost, nServerFlags ) )
		{
			Downloads.OnQueryHits( pHits );
			
			if ( pPacket->m_nType == ED2K_S2CG_SEARCHRESULT )
				Network.OnQueryHits( pHits );
			else
				pHits->Delete();
		}
		break;
	}
	
	return TRUE;
}
Esempio n. 2
0
BOOL CEDClients::OnPacket(const SOCKADDR_IN* pHost, CEDPacket* pPacket)
{
	pPacket->SmartDump( pHost, TRUE, FALSE );

	CSingleLock pLock( &Transfers.m_pSection );
	if ( ! pLock.Lock( 250 ) )
	{
		theApp.Message( MSG_DEBUG, _T("Rejecting ed2k UDP from %s, network core overloaded."), (LPCTSTR)CString( inet_ntoa( (IN_ADDR&)pHost->sin_addr ) ) );
		return FALSE;
	}

	CQuickLock oLock( m_pSection );

	switch ( pPacket->m_nType )
	{
	case ED2K_C2C_UDP_REASKFILEPING:
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );

			if ( ! pClient->OnUdpReask( pPacket ) )
				Datagrams.Send( pHost, CEDPacket::New( ED2K_C2C_UDP_FILENOTFOUND, ED2K_PROTOCOL_EMULE ) );
		}
		else
		{
			Datagrams.Send( pHost, CEDPacket::New( ED2K_C2C_UDP_FILENOTFOUND, ED2K_PROTOCOL_EMULE ) );
		}
		break;
	case ED2K_C2C_UDP_REASKACK:
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );
			pClient->OnUdpReaskAck( pPacket );
		}
		break;
	case ED2K_C2C_UDP_QUEUEFULL:
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );
			pClient->OnUdpQueueFull( pPacket );
		}
		break;
	case ED2K_C2C_UDP_FILENOTFOUND:
		if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
		{
			pClient->m_nUDP = ntohs( pHost->sin_port );
			pClient->OnUdpFileNotFound( pPacket );
		}
		break;
	case ED2K_S2CG_SERVERSTATUS:
		OnServerStatus( pHost, pPacket );
		break;
	case ED2K_S2CG_SEARCHRESULT:
	case ED2K_S2CG_FOUNDSOURCES:
		{
			// Correct port value. (UDP port is TCP port + 4)
			SOCKADDR_IN pAddress = *pHost;
			pAddress.sin_port = htons( ntohs( pHost->sin_port ) - 4 );

			CQuickLock oLock( HostCache.eDonkey.m_pSection );

			// Check server details in host cache
			DWORD nServerFlags = Settings.eDonkey.DefaultServerFlags;
			CHostCacheHostPtr pServer = HostCache.eDonkey.Find( &pAddress.sin_addr );
			if ( pServer && pServer->m_nUDPFlags )
				nServerFlags = pServer->m_nUDPFlags;

			// Decode packet and create hits
			if ( CQueryHit* pHits = CQueryHit::FromEDPacket( pPacket, &pAddress, nServerFlags ) )
			{
				if ( pPacket->m_nType == ED2K_S2CG_SEARCHRESULT )
				{
					Network.OnQueryHits( pHits );
				}
				else
				{
					Downloads.OnQueryHits( pHits );
					pHits->Delete();
				}
			}
		}
		break;

#ifdef _DEBUG
	default:
		CString tmp;
		tmp.Format( _T("Unknown ED2K UDP packet from %s:%u."),
			(LPCTSTR)CString( inet_ntoa( pHost->sin_addr ) ),
			htons( pHost->sin_port ) );
		pPacket->Debug( tmp );
#endif	// Debug
	}

	return TRUE;
}
Esempio n. 3
0
BOOL CEDClients::OnPacket(const SOCKADDR_IN* pHost, CEDPacket* pPacket)
{
	pPacket->SmartDump( pHost, TRUE, FALSE );

	if ( pPacket->m_nEdProtocol == ED2K_PROTOCOL_EDONKEY )
	{
		switch ( pPacket->m_nType )
		{
		case ED2K_S2CG_SERVERSTATUS:
			return OnServerStatus( pHost, pPacket );

		case ED2K_S2CG_SEARCHRESULT:
		case ED2K_S2CG_FOUNDSOURCES:
			return OnServerSearchResult( pHost, pPacket );

#ifdef _DEBUG
		default:
			CString tmp;
			tmp.Format( _T("Unknown packet from %s:%u."), (LPCTSTR)CString( inet_ntoa( pHost->sin_addr ) ), htons( pHost->sin_port ) );
			pPacket->Debug( tmp );
	#endif // _DEBUG
		}
	}
	else
	{
		CSingleLock pLock( &Transfers.m_pSection );
		if ( ! pLock.Lock( 250 ) )
		{
			theApp.Message( MSG_ERROR, _T("Rejecting %s connection from %s, network core overloaded."), protocolNames[ PROTOCOL_ED2K ], (LPCTSTR)CString( inet_ntoa( (IN_ADDR&)pHost->sin_addr ) ) );
			return FALSE;
		}

		CQuickLock oLock( m_pSection );

		switch ( pPacket->m_nType )
		{
		case ED2K_C2C_UDP_REASKFILEPING:
			if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
			{
				pClient->m_nUDP = ntohs( pHost->sin_port );

				if ( ! pClient->OnUdpReask( pPacket ) )
				{
					Datagrams.Send( pHost, CEDPacket::New( ED2K_C2C_UDP_FILENOTFOUND, ED2K_PROTOCOL_EMULE ) );
				}
			}
			else
			{
				Datagrams.Send( pHost, CEDPacket::New( ED2K_C2C_UDP_FILENOTFOUND, ED2K_PROTOCOL_EMULE ) );
			}
			break;

		case ED2K_C2C_UDP_REASKACK:
			if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
			{
				pClient->m_nUDP = ntohs( pHost->sin_port );
				pClient->OnUdpReaskAck( pPacket );
			}
			break;

		case ED2K_C2C_UDP_QUEUEFULL:
			if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
			{
				pClient->m_nUDP = ntohs( pHost->sin_port );
				pClient->OnUdpQueueFull( pPacket );
			}
			break;

		case ED2K_C2C_UDP_FILENOTFOUND:
			if ( CEDClient* pClient = GetByIP( &pHost->sin_addr ) )
			{
				pClient->m_nUDP = ntohs( pHost->sin_port );
				pClient->OnUdpFileNotFound( pPacket );
			}
			break;

	#ifdef _DEBUG
		default:
			CString tmp;
			tmp.Format( _T("Unknown packet from %s:%u."), (LPCTSTR)CString( inet_ntoa( pHost->sin_addr ) ), htons( pHost->sin_port ) );
			pPacket->Debug( tmp );
	#endif // _DEBUG
		}
	}
	return TRUE;
}