Ejemplo n.º 1
0
void PeerNetInfo::SavePeerDetectedAddress( const PEER_ADDRESS& detectedAddr, const SimpleSocketAddress& sockAddr, bool isTCP, bool isInitFromRemote )
{
	// 如果对方是内网ip,则忽略
	if ( 0 == sockAddr.IP || IsPrivateIP( sockAddr.IP ) )
		return;
	// 如果探测到的ip为0或者时内网ip,则忽略
	if ( 0 == detectedAddr.IP || IsPrivateIP( detectedAddr.IP ) )
		return;

	// 如果没有记录tracker返回的DetectedIP才记录
	if ( 0 == this->m_DetectedIP )
	{
		this->SaveOuterIP( detectedAddr.IP );
	}
	if ( detectedAddr.IP != this->m_OuterAddress.IP )
	{
		// 另外一个跟DetectedIP不一致的外网ip,忽略探测到的端口
		return;
	}
	if ( isTCP )
	{
		// 对于tcp,仅当是对方主动发起连接时,tcp外部端口才有效,并过滤掉80端口
		if ( isInitFromRemote && 0 != detectedAddr.TcpPort && 80 != detectedAddr.TcpPort )
			this->m_OuterAddress.TcpPort = detectedAddr.TcpPort;
	}
	else
	{
		if ( 0 != detectedAddr.UdpPort )
			this->m_OuterAddress.UdpPort = detectedAddr.UdpPort;
	}
	VIEW_DEBUG( "SavePeerDetectedAddress " << this->m_OuterAddress << " from " << sockAddr << " with " << detectedAddr << " " << isTCP );
	//Tracer::Trace("SavePeerDetectedAddress %s\n", strings::format_object(this->OuterAddress).c_str());
	CheckPeerNetType();
}
Ejemplo n.º 2
0
PEER_ADDRESS GetProperUDPKeyPeerAddress( const PEER_ADDRESS& peerAddr, const SimpleSocketAddress& sockAddr )
{
	//	LIVE_ASSERT( peerAddr.IP == sockAddr.IP || IsPrivateIP( peerAddr.IP ) );
	if ( peerAddr.IP == sockAddr.IP && IsPrivateIP( sockAddr.IP ) )
		return peerAddr;
	PEER_ADDRESS keyAddress;
	keyAddress.IP = sockAddr.IP;
	keyAddress.TcpPort = peerAddr.TcpPort;
	keyAddress.UdpPort = sockAddr.Port;
	return keyAddress;
}
Ejemplo n.º 3
0
void NetTypedIPPoolImpl::SetExternalIP(UINT externalIP)
{
	if (m_externalIP == externalIP)
		return;
	bool isOldIPPrivate = IsPrivateIP(m_externalIP);
	m_externalIP = externalIP;
	m_localNetType = m_iptable.LocateIP(m_externalIP);
	bool isNewIPPrivate = IsPrivateIP(m_externalIP);
	if (isOldIPPrivate && !isNewIPPrivate)
	{
		IPPOOL_INFO( "LocalExternalIP " << 
				" ("<<m_localNetType.ISP<<":"<<m_localNetType.Country<<":"<<m_localNetType.Province<<":"<<m_localNetType.City<<") End");
		m_DetectIndex.clear();
		m_ConnectIndex.clear();
		STL_FOR_EACH_CONST(NetTypedPeerInfoCollection, m_peers, iter)
		{
			NetTypedIPInfoPtr ipInfo = iter->second;
			IPPoolIndexUpdating indexUpdating(ipInfo, this);
			ipInfo->CalcAddressDistance(m_localNetType, m_iptable);

			IPPOOL_INFO( "RefreshAddressDistance " << ipInfo->Info.Address << " " << ipInfo->RTT << " " << ipInfo->AddressDistance << 
				" ("<<ipInfo->NetworkType<<") End");
		}
Ejemplo n.º 4
0
void CGnuSearch::IncomingHost(FileSource &Source)
{
	int SubnetLimit = 0;

	// check for duplicates
	for(int i = 0; i < m_WholeList.size(); i++)
		if(Source.Sha1Hash == m_WholeList[i].Sha1Hash)
		{
			// filter hosts from same subnet if not private
			if( memcmp(&Source.Address.Host.S_addr, &m_WholeList[i].Address.Host.S_addr, 3) == 0 &&
				!IsPrivateIP(Source.Address.Host) )
			{
				SubnetLimit++;
			
				if(SubnetLimit > SUBNET_LIMIT)
					return;
			}

			// dupe host
			if( Source.Address.Host.S_addr == m_WholeList[i].Address.Host.S_addr && 
				Source.Address.Port == m_WholeList[i].Address.Port )
				return;
		}


	m_WholeList.push_back(Source);

	// Screen Item to user's preferences
	if( !Inspect(Source) )
		return;
	
	m_CurrentList.push_back(Source);
	ResultGroup* pGroup = AddtoGroup(Source);

	if(pGroup && m_pCore->m_dnaCore->m_dnaEvents)
	{
		if(pGroup->ResultList.size() > 1)
			m_pCore->m_dnaCore->m_dnaEvents->SearchUpdate(m_SearchID, pGroup->ResultID);
		else
			m_pCore->m_dnaCore->m_dnaEvents->SearchResult(m_SearchID, pGroup->ResultID);
	}
}