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