📄 trtrackerbtannouncerimpl.java
字号:
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 + -