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

📄 trtrackerservertorrentimpl.java

📁 java 文件下载器。可自定义
💻 JAVA
📖 第 1 页 / 共 4 页
字号:

					}
					List biased_peers = (List)reply.get("biased_peers");
					if (biased_peers != null)
					{
						if (explicit_biased_peers == null)
							explicit_biased_peers = new ArrayList();
						for (int j = 0; j < biased_peers.size(); j++)
						{
							Map peer_map = (Map)biased_peers.get(j);
							String ip = (String)peer_map.get("ip");
							int port = ((Long)peer_map.get("port")).intValue();
							String reuse_key = (new StringBuilder()).append(ip).append(":").append(port).toString();
							TRTrackerServerSimplePeer peer = (TRTrackerServerSimplePeer)peer_reuse_map.get(reuse_key);
							if (peer == null)
								peer = new temporaryBiasedSeed(ip, port);
							if (!explicit_biased_peers.contains(peer))
								explicit_biased_peers.add(peer);
						}

					}
					remove_ips = (Set)reply.get("remove_ips");
				}
				catch (Throwable e)
				{
					Debug.printStackTrace(e);
				}

		}
		if (requesting_peer == null)
		{
			Set bp = server.getBiasedPeers();
			if (bp == null)
				requester_is_biased = false;
			else
				requester_is_biased = bp.contains(ip_address);
		} else
		{
			requester_is_biased = requesting_peer.isBiased();
		}
		if (!caching_enabled || explicit_limited_peers != null || explicit_biased_peers != null || requester_is_biased || remove_ips != null || nat_warning || preprocess_map.size() != 0 || cache_millis <= 0 || num_want < 10 || total_peers < TRTrackerServerImpl.getAnnounceCachePeerThreshold() || crypto_level == 2)
			break MISSING_BLOCK_LABEL_858;
		network_position = null;
		Iterator it = announce_cache.keySet().iterator();
		do
		{
			if (!it.hasNext())
				break;
			Integer key = (Integer)it.next();
			announceCacheEntry entry = (announceCacheEntry)announce_cache.get(key);
			if (now - entry.getTime() > (long)cache_millis)
				it.remove();
		} while (true);
		i = num_want / 10;
_L1:
		Map rep_peer;
		if (i <= num_want / 20)
			break MISSING_BLOCK_LABEL_855;
		announceCacheEntry entry = (announceCacheEntry)announce_cache.get(new Integer(i));
		if (entry == null)
			break MISSING_BLOCK_LABEL_849;
		if (now - entry.getTime() > (long)cache_millis)
		{
			announce_cache.remove(new Integer(i));
			break MISSING_BLOCK_LABEL_849;
		}
		if (entry.getSendPeerIds() != send_peer_ids || entry.getCompactMode() != compact_mode)
			break MISSING_BLOCK_LABEL_849;
		rep_peer = entry.getData();
		this_mon.exit();
		return rep_peer;
		i--;
		  goto _L1
		add_to_cache = true;
		LinkedList rep_peers = new LinkedList();
		if (num_want <= 0 || explicit_limited_peers != null) goto _L3; else goto _L2
_L2:
		if (num_want < total_peers) goto _L5; else goto _L4
_L4:
		i = 0;
_L15:
		TRTrackerServerPeerImpl peer;
		if (i >= peer_list.size())
			break; /* Loop/switch isn't completed */
		peer = (TRTrackerServerPeerImpl)peer_list.get(i);
		if (peer != null && peer != requesting_peer) goto _L7; else goto _L6
_L7:
		if (now <= peer.getTimeout()) goto _L9; else goto _L8
_L8:
		removePeer(peer, i, 5, null);
		  goto _L6
_L9:
		if (peer.getTCPPort() == 0 || crypto_level == 0 && peer.getCryptoLevel() == 2 || remove_ips != null && remove_ips.contains(new String(peer.getIP())) || !include_seeds && peer.isSeed()) goto _L6; else goto _L10
_L10:
		rep_peer = new HashMap(3);
		if (send_peer_ids)
			rep_peer.put("peer id", peer.getPeerId().getHash());
		if (compact_mode == 0) goto _L12; else goto _L11
_L11:
		byte peer_bytes[] = peer.getIPAddressBytes();
		if (peer_bytes != null) goto _L13; else goto _L6
_L13:
		rep_peer.put("ip", peer_bytes);
		if (compact_mode >= 2)
		{
			rep_peer.put("azver", new Long(peer.getAZVer()));
			rep_peer.put("azudp", new Long(peer.getUDPPort()));
			if (peer.isSeed())
				rep_peer.put("azhttp", new Long(peer.getHTTPPort()));
			if (compact_mode >= 16)
			{
				rep_peer.put("ip", peer.getIPAsRead());
			} else
			{
				rep_peer.put("azup", new Long(peer.getUpSpeed()));
				if (peer.isBiased())
					rep_peer.put("azbiased", "");
				if (network_position != null)
				{
					DHTNetworkPosition peer_pos = peer.getNetworkPosition();
					if (peer_pos != null && network_position.getPositionType() == peer_pos.getPositionType())
						rep_peer.put("azrtt", new Long((long)peer_pos.estimateRTT(network_position)));
				}
			}
		}
		  goto _L14
_L12:
		rep_peer.put("ip", peer.getIPAsRead());
_L14:
		rep_peer.put("port", new Long(peer.getTCPPort()));
		if (crypto_level != 0)
			rep_peer.put("crypto_flag", new Long(peer.getCryptoLevel() != 2 ? 0L : 1L));
		if (peer.isBiased())
			rep_peers.addFirst(rep_peer);
		else
			rep_peers.addLast(rep_peer);
_L6:
		i++;
		if (true) goto _L15; else goto _L3
_L5:
		int peer_list_size;
		boolean peer_removed;
		peer_list_size = peer_list.size();
		if (duplicate_peer_checker.length < peer_list_size)
		{
			duplicate_peer_checker = new byte[peer_list_size * 2];
			duplicate_peer_checker_index = 1;
		} else
		if (duplicate_peer_checker.length > peer_list_size * 2)
		{
			duplicate_peer_checker = new byte[(3 * peer_list_size) / 2];
			duplicate_peer_checker_index = 1;
		} else
		{
			duplicate_peer_checker_index++;
			if (duplicate_peer_checker_index == 0)
			{
				Arrays.fill(duplicate_peer_checker, (byte)0);
				duplicate_peer_checker_index = 1;
			}
		}
		peer_removed = false;
		peer_list_compaction_suspended = true;
		int added = 0;
		for (int bad_nat_loop = TRTrackerServerNATChecker.getSingleton().isEnabled() ? 0 : 1; bad_nat_loop < 2; bad_nat_loop++)
		{
			int limit = num_want * 2;
			if (num_want * 3 > total_peers)
				limit++;
			int biased_peers_count = 0;
			if (this.biased_peers != null)
			{
				if (this.biased_peers.size() > 1)
				{
					Object x = this.biased_peers.remove(0);
					this.biased_peers.add(random.nextInt(this.biased_peers.size() + 1), x);
				}
				biased_peers_count = Math.min(min_biased_peers, this.biased_peers.size());
			}
			for (int i = 0; i < limit && added < num_want; i++)
			{
				int peer_index;
				TRTrackerServerPeerImpl peer;
				if (bad_nat_loop == 1 && i < biased_peers_count)
				{
					peer = (TRTrackerServerPeerImpl)this.biased_peers.get(i);
					peer_index = -1;
				} else
				{
					peer_index = random.nextInt(peer_list_size);
					peer = (TRTrackerServerPeerImpl)peer_list.get(peer_index);
					if (peer == null || peer.isBiased())
						continue;
				}
				if (now > peer.getTimeout())
				{
					removePeer(peer, 5, null);
					peer_removed = true;
					continue;
				}
				if (requesting_peer == peer || peer.getTCPPort() == 0 || crypto_level == 0 && peer.getCryptoLevel() == 2 || remove_ips != null && remove_ips.contains(new String(peer.getIP())) || !include_seeds && peer.isSeed())
					continue;
				boolean bad_nat = peer.isNATStatusBad();
				if ((bad_nat_loop != 0 || bad_nat) && bad_nat_loop != 1 || peer_index != -1 && duplicate_peer_checker[peer_index] == duplicate_peer_checker_index)
					continue;
				if (peer_index != -1)
					duplicate_peer_checker[peer_index] = duplicate_peer_checker_index;
				added++;
				Map rep_peer = new HashMap(3);
				if (send_peer_ids)
					rep_peer.put("peer id", peer.getPeerId().getHash());
				if (compact_mode != 0)
				{
					byte peer_bytes[] = peer.getIPAddressBytes();
					if (peer_bytes == null)
						continue;
					rep_peer.put("ip", peer_bytes);
					if (compact_mode >= 2)
					{
						rep_peer.put("azver", new Long(peer.getAZVer()));
						rep_peer.put("azudp", new Long(peer.getUDPPort()));
						if (peer.isSeed())
							rep_peer.put("azhttp", new Long(peer.getHTTPPort()));
						if (compact_mode >= 16)
						{
							rep_peer.put("ip", peer.getIPAsRead());
						} else
						{
							rep_peer.put("azup", new Long(peer.getUpSpeed()));
							if (peer.isBiased())
								rep_peer.put("azbiased", "");
							if (network_position != null)
							{
								DHTNetworkPosition peer_pos = peer.getNetworkPosition();
								if (peer_pos != null && network_position.getPositionType() == peer_pos.getPositionType())
									rep_peer.put("azrtt", new Long((long)peer_pos.estimateRTT(network_position)));
							}
						}
					}
				} else
				{
					rep_peer.put("ip", peer.getIPAsRead());
				}
				rep_peer.put("port", new Long(peer.getTCPPort()));
				if (crypto_level != 0)
					rep_peer.put("crypto_flag", new Long(peer.getCryptoLevel() != 2 ? 0L : 1L));
				if (peer.isBiased())
					rep_peers.addFirst(rep_peer);
				else
					rep_peers.addLast(rep_peer);
			}

		}

		peer_list_compaction_suspended = false;
		if (peer_removed)
			checkForPeerListCompaction(false);
		  goto _L3
		Exception exception;
		exception;
		peer_list_compaction_suspended = false;
		if (peer_removed)
			checkForPeerListCompaction(false);
		throw exception;
_L3:
		Map map;
		if (include_seeds && explicit_limited_peers == null && !send_peer_ids && seed_count < 3 && queued_peers != null)
		{
			Iterator it = queued_peers.iterator();
			List added = new ArrayList(3);
			do
			{
				if (!it.hasNext() || num_want <= rep_peers.size() || added.size() >= 3)
					break;
				QueuedPeer peer = (QueuedPeer)it.next();
				if (peer.isTimedOut(now))
				{
					it.remove();
					continue;
				}
				if (crypto_level == 0 && peer.getCryptoLevel() == 2 || remove_ips != null && remove_ips.contains(peer.getIP()))
					continue;
				Map rep_peer = new HashMap(3);
				if (compact_mode != 0)
				{
					byte peer_bytes[] = peer.getIPAddressBytes();
					if (peer_bytes == null)
						continue;
					rep_peer.put("ip", peer_bytes);
					if (compact_mode >= 2)
					{
						rep_peer.put("azver", new Long(peer.getAZVer()));
						rep_peer.put("azudp", new Long(peer.getUDPPort()));
						if (peer.isSeed())
							rep_peer.put("azhttp", new Long(peer.getHTTPPort()));
						if (compact_mode >= 16)
							rep_peer.put("ip", peer.getIPAsRead());
					}
				} else
				{
					rep_peer.put("ip", peer.getIPAsRead());
				}
				rep_peer.put("port", new Long(peer.getTCPPort()));
				if (crypto_level != 0)
					rep_peer.put("crypto_flag", new Long(peer.getCryptoLevel() != 2 ? 0L : 1L));
				rep_peers.addLast(rep_peer);
				added.add(peer);
				it.remove();
			} while (true);
			for (int i = 0; i < added.size(); i++)
				queued_peers.add(added.get(i));

		}
		Map root = new TreeMap();
		if (preprocess_map.size() > 0)
			root.putAll(preprocess_map);
		if (explicit_limited_peers != null)
		{
			for (int i = 0; i < explicit_limited_peers.size(); i++)
			{
				num_want--;
				TRTrackerServerSimplePeer peer = (TRTrackerServerSimplePeer)explicit_limited_peers.get(i);
				exportPeer(rep_peers, peer, send_peer_ids, compact_mode, crypto_level, network_position);
			}

		}
		if (explicit_biased_peers != null)
		{
			for (int i = 0; i < explicit_biased_peers.size(); i++)
			{
				num_want--;
				TRTrackerServerSimplePeer peer = (TRTrackerServerSimplePeer)explicit_biased_peers.get(i);
				exportPeer(rep_peers, peer, send_peer_ids, compact_mode, crypto_level, network_position);
			}

		}
		if (explicit_manual_biased_peers != null && requesting_peer != null && !requesting_peer.isSeed())
		{
			Object explicit_peer[] = (Object[])(Object[])explicit_manual_biased_peers.get(explicit_next_peer++);
			if (explicit_next_peer == explicit_manual_biased_peers.size())
				explicit_next_peer = 0;
			peer = new HashMap(3);
			if (send_peer_ids)
			{
				byte peer_id[] = new byte[20];
				random.nextBytes(peer_id);
				peer.put("peer id", peer_id);
			}
			if (compact_mode != 0)
			{
				peer_id = (byte[])(byte[])explicit_peer[1];
				peer.put("ip", peer_id);
				if (compact_mode >= 2)
				{
					peer.put("azver", new Long(0L));
					peer.put("azudp", new Long(0L));
					peer.put("azup", new Long(0L));
					peer.put("azbiased", "");
				}
			} else
			{
				peer.put("ip", ((String)explicit_peer[0]).getBytes());
			}
			peer.put("port", new Long(((Integer)explicit_peer[2]).intValue()));
			if (crypto_level != 0)
				peer.put("crypto_flag", new Long(0L));
			rep_peers.addFirst(peer);
		}
		int num_peers_returned = rep_peers.size();
		Iterator it = rep_peers.iterator();
		if (compact_mode == 2)
		{
			byte compact_peers[] = new byte[num_peers_returned * 9];
			for (int index = 0; it.hasNext(); index++)
			{
				Map rep_peer = (Map)it.next();
				byte ip[] = (byte[])(byte[])rep_peer.get("ip");
				int tcp_port = ((Long)rep_peer.get("port")).intValue();
				int udp_port = ((Long)rep_peer.get("azudp")).intValue();
				Long crypto_flag_l = (Long)rep_peer.get("crypto_flag");
				byte crypto_flag = crypto_flag_l != null ? crypto_flag_l.byteValue() : 0;
				int pos = index * 9;
				System.arraycopy(ip, 0, compact_peers, pos, 4);
				pos += 4;
				compact_peers[pos++] = (byte)(tcp_port >> 8);
				compact_peers[pos++] = (byte)(tcp_port & 0xff);
				compact_peers[pos++] = (byte)(udp_port >> 8);
				compact_peers[pos++] = (byte)(udp_port & 0xff);
				compact_peers[pos++] = crypto_flag;
			}

			root.put("peers", compact_peers);
			root.put("azcompact", new Long(1L));
		} else
		if (compact_mode == 3)
		{
			List compact_peers = new ArrayList(num_peers_returned);
			do
			{
				if (!it.hasNext())
					break;
				Map rep_peer = (Map)it.next();
				Map peer = new HashMap();
				compact_peers.add(peer);
				byte ip[] = (byte[])(byte[])rep_peer.get("ip");
				peer.put("i", ip);
				int tcp_port = ((Long)rep_peer.get("port")).intValue();
				peer.put("t", new byte[] {
					(byte)(tcp_port >> 8), (byte)(tcp_port & 0xff)
				});
				int udp_port = ((Long)rep_peer.get("azudp")).intValue();
				if (udp_port != 0)
					if (udp_port == tcp_port)
						peer.put("u", new byte[0]);
					else
						peer.put("u", new byte[] {
							(byte)(udp_port >> 8), (byte)(udp_port & 0xff)
						});
				Long http_port_l = (Long)rep_peer.get("azhttp");
				if (http_port_l != null)
				{
					int http_port = http_port_l.intValue();
					if (http_port != 0)
						peer.put("h", new byte[] {
							(byte)(http_port >> 8), (byte)(http_port & 0xff)
						});
				}
				Long crypto_flag_l = (Long)rep_peer.get("crypto_flag");
				byte crypto_flag = crypto_flag_l != null ? crypto_flag_l.byteValue() : 0;
				if (crypto_flag != 0)
					peer.put("c", new byte[] {
						crypto_flag
					});
				Long az_ver_l = (Long)rep_peer.get("azver");
				byte az_ver = az_ver_l != null ? az_ver_l.byteValue() : 0;
				if (az_ver != 0)
					peer.put("v", new Long(az_ver));
				Long up_speed = (Long)rep_peer.get("azup");
				if (up_speed != null && up_speed.longValue() != 0L)
					peer.put("s", up_speed);
				Long rtt = (Long)rep_peer.get("azrtt");
				if (rtt != null)
					peer.put("r", rtt);
				if (rep_peer.containsKey("azbiased"))
					peer.put("b", new Long(1L));
			} while (true);
			root.put("peers", compact_peers);
			root.put("azcompact", new Long(2L));
		} else
		if (compact_mode == 16)
		{
			List xml_peers = new ArrayList(num_peers_returned);
			do
			{
				if (!it.hasNext())
					break;
				Map rep_peer = (Map)it.next();
				Map peer = new HashMap();
				xml_peers.add(peer);
				peer.put("ip", rep_peer.get("ip"));
				peer.put("tcp", rep_peer.get("port"));
				int udp_port = ((Long)rep_peer.get("azudp")).intValue();
				if (udp_port != 0)
					peer.put("udp", new Long(udp_port));
				Long http_port_l = (Long)rep_peer.get("azhttp");
				if (http_port_l != null)
				{
					int http_port = http_port_l.intValue();
					if (http_port != 0)
						peer.put("http", new Long(http_port));
				}
			} while (true);
			root.put("peers", xml_peers);
		} else
		{
			byte crypto_flags[] = null;
			if (crypto_level != 0)
				crypto_flags = new byte[num_peers_returned];
			if (compact_mode == 1)
			{
				byte compact_peers[] = new byte[num_peers_returned * 6];
				int index = 0;
				int num_ipv4 = 0;
				int num_ipv6 = 0;
				while (it.hasNext()) 
				{
					Map rep_peer = (Map)it.next();
					byte ip[] = (byte[])(byte[])rep_peer.get("ip");
					if (ip.length > 4)
					{
						num_ipv6++;
					} else
					{
						num_ipv4++;
						if (num_ipv6 == 0)
						{
							int port = ((Long)rep_peer.get("port")).intValue();
							int pos = index * 6;
							System.arraycopy(ip, 0, compact_peers, pos, 4);
							pos += 4;
							compact_peers[pos++] = (byte)(port >> 8);
							compact_peers[pos++] = (byte)(port & 0xff);
						}
					}
					if (crypto_flags != null)
					{
						Long crypto_flag = (Long)rep_peer.remove("crypto_flag");
						crypto_flags[index] = crypto_flag.byteValue();
					}
					index++;
				}
				if (num_ipv6 > 0)
				{

⌨️ 快捷键说明

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