⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trtrackerbtannouncerimpl.java

📁 java 文件下载器。可自定义
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
		byte crypto_flags[] = (byte[])(byte[])metaData.get("crypto_flags");
		List valid_meta_peers = new ArrayList();
		Object meta_peers_peek = metaData.get("peers");
		Long az_compact_l = (Long)metaData.get("azcompact");
		long az_compact = az_compact_l != null ? az_compact_l.longValue() : 0L;
		boolean this_is_az_tracker = az_compact == 2L;
		if (az_tracker != this_is_az_tracker || lastUsedUrl != lastAZTrackerCheckedURL)
		{
			lastAZTrackerCheckedURL = lastUsedUrl;
			az_tracker = this_is_az_tracker;
			TRTrackerUtils.setAZTracker(url, az_tracker);
		}
		if (az_compact == 2L)
		{
			List meta_peers = (List)meta_peers_peek;
			int peers_length = meta_peers.size();
			if (peers_length > 1)
			{
				long total_rtt = 0L;
				int rtt_count = 0;
				for (int i = 0; i < peers_length; i++)
				{
					Map peer = (Map)meta_peers.get(i);
					Long l_rtt = (Long)peer.get("r");
					if (l_rtt == null)
						continue;
					long rtt = l_rtt.longValue();
					if (rtt <= 0L)
						peer.remove("r");
					else
						total_rtt += rtt;
					rtt_count++;
				}

				final int average_rtt = (int)(rtt_count != 0 ? total_rtt / (long)rtt_count : 0L);
				Collections.sort(meta_peers, new Comparator() {

					final int val$average_rtt;
					final TRTrackerBTAnnouncerImpl this$0;

					public int compare(Object o1, Object o2)
					{
						Map map1 = (Map)o1;
						Map map2 = (Map)o2;
						Long l_rtt1 = (Long)map1.get("r");
						Long l_rtt2 = (Long)map2.get("r");
						boolean biased_1 = map1.containsKey("b");
						boolean biased_2 = map2.containsKey("b");
						if (biased_1 == biased_2)
						{
							int rtt1 = l_rtt1 != null ? l_rtt1.intValue() : average_rtt;
							int rtt2 = l_rtt2 != null ? l_rtt2.intValue() : average_rtt;
							return rtt1 - rtt2;
						}
						return !biased_1 ? 1 : -1;
					}

			
			{
				this$0 = TRTrackerBTAnnouncerImpl.this;
				average_rtt = i;
				super();
			}
				});
				int biased_pos = peers_length;
				int non_biased_pos = peers_length;
				for (int i = 0; i < peers_length; i++)
				{
					Map peer = (Map)meta_peers.get(i);
					if (peer.containsKey("b"))
					{
						if (i == 0)
							biased_pos = i;
						continue;
					}
					non_biased_pos = i;
					break;
				}

				List new_peers = new ArrayList(peers_length);
				int non_biased_start = non_biased_pos;
				boolean last_biased = true;
				while (biased_pos < non_biased_start || non_biased_pos < peers_length) 
					if (biased_pos < non_biased_start)
					{
						if (non_biased_pos < peers_length)
						{
							Map biased = (Map)meta_peers.get(biased_pos);
							Map non_biased = (Map)meta_peers.get(non_biased_pos);
							boolean use_biased;
							if (!last_biased)
							{
								use_biased = true;
							} else
							{
								Long l_rtt_biased = (Long)biased.get("r");
								Long l_rtt_non_biased = (Long)non_biased.get("r");
								int biased_rtt = l_rtt_biased != null ? l_rtt_biased.intValue() : average_rtt;
								int non_biased_rtt = l_rtt_non_biased != null ? l_rtt_non_biased.intValue() : average_rtt;
								use_biased = non_biased_rtt >= biased_rtt;
							}
							if (use_biased)
							{
								new_peers.add(biased);
								biased_pos++;
							} else
							{
								new_peers.add(non_biased);
								non_biased_pos++;
							}
							last_biased = use_biased;
						} else
						{
							new_peers.add(meta_peers.get(biased_pos++));
						}
					} else
					{
						new_peers.add(meta_peers.get(non_biased_pos++));
					}
				meta_peers = new_peers;
			}
			for (int i = 0; i < peers_length; i++)
			{
				Map peer = (Map)meta_peers.get(i);
				try
				{
					byte ip_bytes[] = (byte[])(byte[])peer.get("i");
					String ip;
					if (ip_bytes.length == 4)
					{
						int ip1 = 0xff & ip_bytes[0];
						int ip2 = 0xff & ip_bytes[1];
						int ip3 = 0xff & ip_bytes[2];
						int ip4 = 0xff & ip_bytes[3];
						ip = (new StringBuilder()).append(ip1).append(".").append(ip2).append(".").append(ip3).append(".").append(ip4).toString();
					} else
					{
						StringBuffer sb = new StringBuffer(39);
						for (int j = 0; j < 16; j += 2)
						{
							sb.append(Integer.toHexString(ip_bytes[j] << 8 & 0xff00 | ip_bytes[j + 1] & 0xff));
							if (j < 14)
								sb.append(":");
						}

						ip = sb.toString();
					}
					byte tcp_bytes[] = (byte[])(byte[])peer.get("t");
					int tcp_port = ((tcp_bytes[0] & 0xff) << 8) + (tcp_bytes[1] & 0xff);
					byte peer_peer_id[] = getAnonymousPeerId(ip, tcp_port);
					int udp_port = 0;
					byte udp_bytes[] = (byte[])(byte[])peer.get("u");
					if (udp_bytes != null)
						if (udp_bytes.length == 0)
							udp_port = tcp_port;
						else
							udp_port = ((udp_bytes[0] & 0xff) << 8) + (udp_bytes[1] & 0xff);
					int http_port = 0;
					byte http_bytes[] = (byte[])(byte[])peer.get("h");
					if (http_bytes != null)
						http_port = ((http_bytes[0] & 0xff) << 8) + (http_bytes[1] & 0xff);
					short protocol = 1;
					byte protocol_bytes[] = (byte[])(byte[])peer.get("c");
					if (protocol_bytes != null)
						protocol = (protocol_bytes[0] & 1) != 0 ? 2 : 1;
					Long l_azver = (Long)peer.get("v");
					byte az_ver = l_azver != null ? l_azver.byteValue() : 1;
					Long l_up_speed = (Long)peer.get("s");
					boolean biased = peer.containsKey("b");
					if (biased)
						PeerClassifier.setAzureusIP(ip);
					TRTrackerAnnouncerResponsePeerImpl new_peer = new TRTrackerAnnouncerResponsePeerImpl("Tracker", peer_peer_id, ip, tcp_port, udp_port, http_port, protocol, az_ver, l_up_speed != null ? ((int) (l_up_speed.shortValue())) : 0);
					if (Logger.isEnabled())
					{
						String extra = "";
						Long l_rtt = (Long)peer.get("r");
						if (l_rtt != null)
							extra = (new StringBuilder()).append(",rtt=").append(l_rtt).toString();
						if (biased)
							extra = (new StringBuilder()).append(extra).append(",biased").toString();
						Logger.log(new LogEvent(torrent, LOGID, (new StringBuilder()).append("AZ2-COMPACT PEER: ").append(new_peer.getString()).append(extra).toString()));
					}
					valid_meta_peers.add(new_peer);
				}
				catch (Throwable e)
				{
					if (Logger.isEnabled())
						Logger.log(new LogEvent(torrent, LOGID, 3, (new StringBuilder()).append("Invalid az2 peer received: ").append(peer).toString()));
				}
			}

		} else
		if (meta_peers_peek instanceof List)
		{
			List meta_peers = (List)meta_peers_peek;
			int peers_length = meta_peers.size();
			if (crypto_flags != null && peers_length != crypto_flags.length)
			{
				crypto_flags = null;
				if (Logger.isEnabled())
					Logger.log(new LogEvent(torrent, LOGID, 3, "Invalid crypto_flags returned: length mismatch"));
			}
			for (int i = 0; i < peers_length; i++)
			{
				Map peer = (Map)meta_peers.get(i);
				Object s_peerid = peer.get("peer id");
				Object s_ip = peer.get("ip");
				Object s_port = peer.get("port");
				if (s_ip != null && s_port != null)
				{
					String ip = new String((byte[])(byte[])s_ip, "UTF8");
					int peer_port = ((Long)s_port).intValue();
					if (peer_port > 65535)
						peer_port -= 0x10000;
					if (peer_port < 0)
						peer_port += 0x10000;
					if (peer_port < 0 || peer_port > 65535)
					{
						if (Logger.isEnabled())
							Logger.log(new LogEvent(torrent, LOGID, 3, (new StringBuilder()).append("Invalid peer port given: ").append(ip).append(": ").append(peer_port).toString()));
					} else
					{
						byte peer_peer_id[];
						if (s_peerid == null)
							peer_peer_id = getAnonymousPeerId(ip, peer_port);
						else
							peer_peer_id = (byte[])(byte[])s_peerid;
						short protocol;
						if (crypto_flags == null)
							protocol = 1;
						else
							protocol = crypto_flags[i] != 0 ? 2 : 1;
						int udp_port = 0;
						int http_port = 0;
						TRTrackerAnnouncerResponsePeerImpl new_peer = new TRTrackerAnnouncerResponsePeerImpl("Tracker", peer_peer_id, ip, peer_port, udp_port, http_port, protocol, (byte)1, 0);
						if (Logger.isEnabled())
							Logger.log(new LogEvent(torrent, LOGID, (new StringBuilder()).append("NON-COMPACT PEER: ").append(new_peer.getString()).toString()));
						valid_meta_peers.add(new_peer);
					}
				}
			}

		} else
		if (meta_peers_peek instanceof byte[])
		{
			byte meta_peers[] = (byte[])(byte[])meta_peers_peek;
			int entry_size = az_compact != 1L ? 6 : 9;
			if (crypto_flags != null && meta_peers.length / entry_size != crypto_flags.length)
			{
				crypto_flags = null;
				if (Logger.isEnabled())
					Logger.log(new LogEvent(torrent, LOGID, 3, "Invalid crypto_flags returned: length mismatch"));
			}
			int peer_number = 0;
			for (int i = 0; i < meta_peers.length; i += entry_size)
			{
				peer_number++;
				int ip1 = 0xff & meta_peers[i];
				int ip2 = 0xff & meta_peers[i + 1];
				int ip3 = 0xff & meta_peers[i + 2];
				int ip4 = 0xff & meta_peers[i + 3];
				int po1 = 0xff & meta_peers[i + 4];
				int po2 = 0xff & meta_peers[i + 5];
				String ip = (new StringBuilder()).append("").append(ip1).append(".").append(ip2).append(".").append(ip3).append(".").append(ip4).toString();
				int tcp_port = po1 * 256 + po2;
				if (tcp_port < 0 || tcp_port > 65535)
				{
					if (Logger.isEnabled())
						Logger.log(new LogEvent(torrent, LOGID, 3, (new StringBuilder()).append("Invalid compact peer port given: ").append(ip).append(": ").append(tcp_port).toString()));
				} else
				{
					byte peer_peer_id[] = getAnonymousPeerId(ip, tcp_port);
					short protocol;
					int udp_port;
					if (az_compact == 1L)
					{
						int upo1 = 0xff & meta_peers[i + 6];
						int upo2 = 0xff & meta_peers[i + 7];
						udp_port = upo1 * 256 + upo2;
						byte flags = meta_peers[i + 8];
						protocol = (flags & 1) != 0 ? 2 : 1;
					} else
					{
						if (crypto_flags == null)
							protocol = 1;
						else
							protocol = crypto_flags[peer_number - 1] != 0 ? 2 : 1;
						udp_port = 0;
					}
					int http_port = 0;
					TRTrackerAnnouncerResponsePeerImpl peer = new TRTrackerAnnouncerResponsePeerImpl("Tracker", peer_peer_id, ip, tcp_port, udp_port, http_port, protocol, (byte)1, 0);
					if (Logger.isEnabled())
						Logger.log(new LogEvent(torrent, LOGID, (new StringBuilder()).append("COMPACT PEER: ").append(peer.getString()).toString()));
					valid_meta_peers.add(peer);
				}
			}

		} else
		if (meta_peers_peek instanceof Map)
		{
			if (((Map)meta_peers_peek).size() != 0)
				throw new IOException("peers missing from response");
		} else
		if (!metaData.containsKey("peers6"))
			throw new IOException("peers missing from response");
		byte v6peers[] = (byte[])(byte[])metaData.get("peers6");
		if (v6peers != null)
		{
			int entry_size = 18;
			byte rawAddr[] = new byte[16];
			for (int i = 0; i < v6peers.length; i += 18)
			{
				System.arraycopy(v6peers, i, rawAddr, 0, 16);
				String ip = InetAddress.getByAddress(rawAddr).getHostAddress();
				int po1 = 0xff & v6peers[i + 16];
				int po2 = 0xff & v6peers[i + 17];
				int tcp_port = po1 * 256 + po2;
				if (tcp_port < 0 || tcp_port > 65535)
				{
					if (Logger.isEnabled())
						Logger.log(new LogEvent(torrent, LOGID, 3, (new StringBuilder()).append("Invalid compactv6 peer port given: ").append(ip).append(": ").append(tcp_port).toString()));
					continue;
				}
				byte peer_peer_id[] = getAnonymousPeerId(ip, tcp_port);
				short protocol = 1;
				TRTrackerAnnouncerResponsePeerImpl peer = new TRTrackerAnnouncerResponsePeerImpl("Tracker", peer_peer_id, ip, tcp_port, 0, 0, protocol, (byte)1, 0);
				if (Logger.isEnabled())
					Logger.log(new LogEvent(torrent, LOGID, (new StringBuilder()).append("COMPACTv6 PEER: ").append(peer.getString()).toString()));
				valid_meta_peers.add(peer);
			}

		}
		TRTrackerAnnouncerResponsePeerImpl peers[] = new TRTrackerAnnouncerResponsePeerImpl[valid_meta_peers.size()];
		valid_meta_peers.toArray(peers);
		addToTrackerCache(peers);
		resp = new TRTrackerAnnouncerResponseImpl(url, torrent_hash, 2, time_to_wait, peers);
		failure_added_time = 0;
		Map extensions = (Map)metaData.get("extensions");
		resp.setExtensions(extensions);
		if (extensions != null)
		{
			if (complete_l == null)
				complete_l = (Long)extensions.get("complete");
			if (incomplete_l == null)
				incomplete_l = (Long)extensions.get("incomplete");
			if (Logger.isEnabled())
				Logger.log(new LogEvent(torrent, LOGID, (new StringBuilder()).append("ANNOUNCE SCRAPE2: seeds=").append(complete_l).append(" peers=").append(incomplete_l).toString()));
			Object override = extensions.get("min interval override");
			if (override != null && (override instanceof Long))
				min_interval_override = ((Long)override).longValue();
		}
		if (complete_l != null || incomplete_l != null)
		{
			int complete = complete_l != null ? complete_l.intValue() : 0;
			int incomplete = incomplete_l != null ? incomplete_l.intValue() : 0;
			if (complete < 0 || incomplete < 0)
			{
				resp.setFailurReason(MessageText.getString("Tracker.announce.ignorePeerSeed", new String[] {
					(new StringBuilder()).append(complete >= 0 ? "" : (new StringBuilder()).append(MessageText.getString("MyTorrentsView.seeds")).append(" == ").append(complete).append(". ").toString()).append(incomplete >= 0 ? "" : (new StringBuilder()).append(MessageText.getString("MyTorrentsView.peers")).append(" == ").append(incomplete).append(". ").toString()).toString()
				}));
			} else
			{
				resp.setScrapeResult(complete, incomplete);
				TRTrackerScraper scraper = TRTrackerScraperFactory.getSingleton();
				if (scraper != null)
				{
					TRTrackerScraperResponse scrapeResponse = scraper.scrape(this);
					if (scrapeResponse != null)
					{
						long lNextScrapeTime = scrapeResponse.getNextScrapeStartTime();
						long lNewNextScrapeTime = TRTrackerScraperResponseImpl.calcScrapeIntervalSecs(0, complete) * 1000;
						scrapeResponse.setScrapeStartTime(SystemTime.getCurrentTime());
						if (lNextScrapeTime < lNewNextScrapeTime)
							scrapeResponse.setNextScrapeStartTime(lNewNextScrapeTime);
						scrapeResponse.setSeedsPeers(complete, incomplete);
					}
				}
			}
		}
		return resp;
		IOException e;
		e;
		String trace_data;
		if (data.length <= 150)
			trace_data = new String(data);
		else
			trace_data = (new StringBuilder()).append(new String(data, 0, 150)).append("...").toString();
		if (Logger.isEnabled())
			Logger.log(new LogEvent(torrent, LOGID, 3, (new StringBuilder()).append("TRTrackerAnnouncer::invalid reply: ").append(trace_data).toString()));
		failure_reason = (new StringBuilder()).append("invalid reply: ").append(tr

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -