📄 trtrackerserverprocessorudp.java
字号:
// single shot id, can't be reused
connection_id_map.remove( key );
}
boolean ok = data.getAddress().equals( client_address );
// System.out.println( "TRTrackerServerProcessorUDP: tested:" + id + "/" + client_address + " -> " + ok );
return( ok );
}finally{
random_mon.exit();
}
}
protected PRUDPPacket
handleConnect(
String client_ip_address,
PRUDPPacketRequest request )
{
long conn_id = allocateConnectionId( client_ip_address );
PRUDPPacket reply = new PRUDPPacketReplyConnect(request.getTransactionId(), conn_id );
return( reply );
}
// returns reply packet and associated torrent if exists
protected Object[]
handleAnnounceAndScrape(
String client_ip_address,
PRUDPPacketRequest request,
int request_type )
throws Exception
{
if ( !checkConnectionId( client_ip_address, request.getConnectionId())){
return( null );
}
byte[] hash_bytes = null;
HashWrapper peer_id = null;
int port = 0;
String event = null;
long uploaded = 0;
long downloaded = 0;
long left = 0;
int num_want = -1;
String key = null;
if ( request_type == TRTrackerServerRequest.RT_ANNOUNCE ){
if ( PRUDPPacketTracker.VERSION == 1 ){
PRUDPPacketRequestAnnounce announce = (PRUDPPacketRequestAnnounce)request;
hash_bytes = announce.getHash();
peer_id = new HashWrapper( announce.getPeerId());
port = announce.getPort();
int i_event = announce.getEvent();
switch( i_event ){
case PRUDPPacketRequestAnnounce.EV_STARTED:
{
event = "started";
break;
}
case PRUDPPacketRequestAnnounce.EV_STOPPED:
{
event = "stopped";
break;
}
case PRUDPPacketRequestAnnounce.EV_COMPLETED:
{
event = "completed";
break;
}
}
uploaded = announce.getUploaded();
downloaded = announce.getDownloaded();
left = announce.getLeft();
num_want = announce.getNumWant();
int i_ip = announce.getIPAddress();
if ( i_ip != 0 ){
client_ip_address = PRHelpers.intToAddress( i_ip );
}
}else{
PRUDPPacketRequestAnnounce2 announce = (PRUDPPacketRequestAnnounce2)request;
hash_bytes = announce.getHash();
peer_id = new HashWrapper( announce.getPeerId());
port = announce.getPort();
int i_event = announce.getEvent();
switch( i_event ){
case PRUDPPacketRequestAnnounce.EV_STARTED:
{
event = "started";
break;
}
case PRUDPPacketRequestAnnounce.EV_STOPPED:
{
event = "stopped";
break;
}
case PRUDPPacketRequestAnnounce.EV_COMPLETED:
{
event = "completed";
break;
}
}
uploaded = announce.getUploaded();
downloaded = announce.getDownloaded();
left = announce.getLeft();
num_want = announce.getNumWant();
int i_ip = announce.getIPAddress();
if ( i_ip != 0 ){
client_ip_address = PRHelpers.intToAddress( i_ip );
}
key = "" + announce.getKey();
}
}else{
PRUDPPacketRequestScrape scrape = (PRUDPPacketRequestScrape)request;
hash_bytes = scrape.getHash();
}
Map[] root_out = new Map[1];
TRTrackerServerPeerImpl[] peer_out = new TRTrackerServerPeerImpl[1];
TRTrackerServerTorrentImpl torrent =
processTrackerRequest(
server, "", root_out, peer_out,
request_type,
new byte[][]{ hash_bytes }, null,
peer_id, false, TRTrackerServerTorrentImpl.COMPACT_MODE_NONE, key, // currently no "no_peer_id" / "compact" in the packet and anyway they aren't returned / key
event, false,
port,
0, 0,
client_ip_address, client_ip_address,
downloaded, uploaded, left,
num_want,
TRTrackerServerPeer.CRYPTO_NONE,
(byte)1,
0,
null );
Map root = root_out[0];
if ( request_type == TRTrackerServerRequest.RT_ANNOUNCE ){
if ( PRUDPPacketTracker.VERSION == 1 ){
PRUDPPacketReplyAnnounce reply = new PRUDPPacketReplyAnnounce(request.getTransactionId());
reply.setInterval(((Long)root.get("interval")).intValue());
List peers = (List)root.get("peers");
int[] addresses = new int[peers.size()];
short[] ports = new short[addresses.length];
for (int i=0;i<addresses.length;i++){
Map peer = (Map)peers.get(i);
addresses[i] = PRHelpers.addressToInt(new String((byte[])peer.get("ip")));
ports[i] = (short)((Long)peer.get("port")).shortValue();
}
reply.setPeers( addresses, ports );
return( new Object[]{ reply, torrent });
}else{
PRUDPPacketReplyAnnounce2 reply = new PRUDPPacketReplyAnnounce2(request.getTransactionId());
reply.setInterval(((Long)root.get("interval")).intValue());
boolean local_scrape = client_ip_address.equals( "127.0.0.1" );
Map scrape_details = torrent.exportScrapeToMap( "", client_ip_address,!local_scrape );
int seeders = ((Long)scrape_details.get("complete")).intValue();
int leechers = ((Long)scrape_details.get("incomplete")).intValue();
reply.setLeechersSeeders(leechers,seeders);
List peers = (List)root.get("peers");
int[] addresses = new int[peers.size()];
short[] ports = new short[addresses.length];
for (int i=0;i<addresses.length;i++){
Map peer = (Map)peers.get(i);
addresses[i] = PRHelpers.addressToInt(new String((byte[])peer.get("ip")));
ports[i] = (short)((Long)peer.get("port")).shortValue();
}
reply.setPeers( addresses, ports );
return( new Object[]{ reply, torrent });
}
}else{
if ( PRUDPPacketTracker.VERSION == 1 ){
PRUDPPacketReplyScrape reply = new PRUDPPacketReplyScrape(request.getTransactionId());
/*
Long interval = (Long)root.get("interval");
if ( interval != null ){
reply.setInterval(interval.intValue());
}
*/
Map files = (Map)root.get( "files" );
byte[][] hashes = new byte[files.size()][];
int[] s_complete = new int[hashes.length];
int[] s_downloaded = new int[hashes.length];
int[] s_incomplete = new int[hashes.length];
Iterator it = files.keySet().iterator();
int pos = 0;
while(it.hasNext()){
String hash_str = (String)it.next();
hashes[pos] = hash_str.getBytes( Constants.BYTE_ENCODING );
Map details = (Map)files.get( hash_str );
s_complete[pos] = ((Long)details.get("complete")).intValue();
s_incomplete[pos] = ((Long)details.get("incomplete")).intValue();
s_downloaded[pos] = ((Long)details.get("downloaded")).intValue();
pos++;
}
reply.setDetails( hashes, s_complete, s_downloaded, s_incomplete );
return( new Object[]{ reply, torrent });
}else{
PRUDPPacketReplyScrape2 reply = new PRUDPPacketReplyScrape2(request.getTransactionId());
/*
Long interval = (Long)root.get("interval");
if ( interval != null ){
reply.setInterval(interval.intValue());
}
*/
Map files = (Map)root.get( "files" );
int[] s_complete = new int[files.size()];
int[] s_downloaded = new int[s_complete.length];
int[] s_incomplete = new int[s_complete.length];
Iterator it = files.keySet().iterator();
int pos = 0;
while(it.hasNext()){
String hash_str = (String)it.next();
Map details = (Map)files.get( hash_str );
s_complete[pos] = ((Long)details.get("complete")).intValue();
s_incomplete[pos] = ((Long)details.get("incomplete")).intValue();
s_downloaded[pos] = ((Long)details.get("downloaded")).intValue();
pos++;
}
reply.setDetails( s_complete, s_downloaded, s_incomplete );
return( new Object[]{ reply, torrent });
}
}
}
protected static class
connectionData
{
protected String address;
protected long time;
protected
connectionData(
String _address )
{
address = _address;
time = SystemTime.getCurrentTime();
}
protected String
getAddress()
{
return( address );
}
protected long
getTime()
{
return( time );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -