📄 pepeercontrolimpl.java
字号:
{
if (is_running && !seeding_mode && (prefer_udp || prefer_udp_default))
{
int udp = pc.getUDPListenPort();
if (udp != 0 && udp == pc.getTCPListenPort())
{
BloomFilter filter = prefer_udp_bloom;
if (filter == null)
filter = prefer_udp_bloom = BloomFilterFactory.createAddOnly(10000);
if (filter.getEntryCount() < 1000)
filter.add(pc.getIp().getBytes());
}
}
int piece = pc.getUniqueAnnounce();
if (piece != -1 && superSeedMode)
{
superSeedModeNumberOfAnnounces--;
superSeedPieces[piece].peerLeft();
}
int reserved_piece = pc.getReservedPieceNumber();
if (reserved_piece >= 0)
{
PEPiece pe_piece = pePieces[reserved_piece];
if (pe_piece != null)
{
String reserved_by = pe_piece.getReservedBy();
if (reserved_by != null && reserved_by.equals(pc.getIp()))
pe_piece.setReservedBy(null);
}
}
adapter.removePeer(pc);
ArrayList peer_manager_listeners = peer_manager_listeners_cow;
for (int i = 0; i < peer_manager_listeners.size(); i++)
((PEPeerManagerListener)peer_manager_listeners.get(i)).peerRemoved(this, pc);
}
public void addPiece(PEPiece piece, int pieceNumber)
{
addPiece(piece, pieceNumber, false);
}
protected void addPiece(PEPiece piece, int pieceNumber, boolean force_add)
{
pePieces[pieceNumber] = (PEPieceImpl)piece;
nbPiecesActive++;
if (is_running || force_add)
adapter.addPiece(piece);
}
public void removePiece(PEPiece pePiece, int pieceNumber)
{
if (pePiece != null)
adapter.removePiece(pePiece);
pePieces[pieceNumber] = null;
nbPiecesActive--;
}
public int getNbActivePieces()
{
return nbPiecesActive;
}
public String getElapsedTime()
{
return TimeFormatter.format((SystemTime.getCurrentTime() - _timeStarted) / 1000L);
}
public long getTimeStarted()
{
return _timeStarted;
}
public long getTimeStartedSeeding()
{
return _timeStartedSeeding;
}
private byte[] computeMd5Hash(DirectByteBuffer buffer)
{
BrokenMd5Hasher md5 = new BrokenMd5Hasher();
md5.reset();
int position = buffer.position((byte)8);
md5.update(buffer.getBuffer((byte)8));
buffer.position((byte)8, position);
ByteBuffer md5Result = ByteBuffer.allocate(16);
md5Result.position(0);
md5.finalDigest(md5Result);
byte result[] = new byte[16];
md5Result.position(0);
for (int i = 0; i < result.length; i++)
result[i] = md5Result.get();
return result;
}
private void MD5CheckPiece(PEPiece piece, boolean correct)
{
String writers[] = piece.getWriters();
int offset = 0;
for (int i = 0; i < writers.length; i++)
{
int length = piece.getBlockSize(i);
String peer = writers[i];
if (peer != null)
{
DirectByteBuffer buffer = disk_mgr.readBlock(piece.getPieceNumber(), offset, length);
if (buffer != null)
{
byte hash[] = computeMd5Hash(buffer);
buffer.returnToPool();
buffer = null;
piece.addWrite(i, peer, hash, correct);
}
}
offset += length;
}
}
public void checkCompleted(DiskManagerCheckRequest request, boolean passed)
{
piece_check_result_list_mon.enter();
piece_check_result_list.add(((Object) (new Object[] {
request, new Integer(passed ? 1 : 0)
})));
piece_check_result_list_mon.exit();
break MISSING_BLOCK_LABEL_64;
Exception exception;
exception;
piece_check_result_list_mon.exit();
throw exception;
}
public void checkCancelled(DiskManagerCheckRequest request)
{
piece_check_result_list_mon.enter();
piece_check_result_list.add(((Object) (new Object[] {
request, new Integer(2)
})));
piece_check_result_list_mon.exit();
break MISSING_BLOCK_LABEL_56;
Exception exception;
exception;
piece_check_result_list_mon.exit();
throw exception;
}
public void checkFailed(DiskManagerCheckRequest request, Throwable cause)
{
piece_check_result_list_mon.enter();
piece_check_result_list.add(((Object) (new Object[] {
request, new Integer(0)
})));
piece_check_result_list_mon.exit();
break MISSING_BLOCK_LABEL_56;
Exception exception;
exception;
piece_check_result_list_mon.exit();
throw exception;
}
public boolean needsMD5CheckOnCompletion(int pieceNumber)
{
PEPieceImpl piece = pePieces[pieceNumber];
if (piece == null)
return false;
else
return piece.getPieceWrites().size() > 0;
}
private void processPieceCheckResult(DiskManagerCheckRequest request, int outcome)
{
int check_type = ((Integer)request.getUserData()).intValue();
int pieceNumber;
pieceNumber = request.getPieceNumber();
if (check_type != 2)
break MISSING_BLOCK_LABEL_114;
if (outcome == 0)
{
Debug.out((new StringBuilder()).append(getDisplayName()).append(": Piece #").append(pieceNumber).append(" failed final re-check. Re-downloading...").toString());
if (!restart_initiated)
{
restart_initiated = true;
adapter.restartDownload(true);
}
}
if (check_type == 3)
rescan_piece_time = SystemTime.getCurrentTime();
if (!seeding_mode)
checkFinished(false);
return;
if (check_type != 4 && check_type != 5)
break MISSING_BLOCK_LABEL_310;
if (outcome == 0)
{
if (check_type == 4)
Debug.out((new StringBuilder()).append(getDisplayName()).append("Piece #").append(pieceNumber).append(" failed recheck while seeding. Re-downloading...").toString());
else
Debug.out((new StringBuilder()).append(getDisplayName()).append("Piece #").append(pieceNumber).append(" failed recheck after being reported as bad. Re-downloading...").toString());
Logger.log(new LogAlert(this, true, 3, (new StringBuilder()).append("Download '").append(getDisplayName()).append("': piece ").append(pieceNumber).append(" has been corrupted, re-downloading").toString()));
if (!restart_initiated)
{
restart_initiated = true;
adapter.restartDownload(true);
}
}
if (check_type == 3)
rescan_piece_time = SystemTime.getCurrentTime();
if (!seeding_mode)
checkFinished(false);
return;
PEPieceImpl pePiece;
pePiece = pePieces[pieceNumber];
if (outcome != 1)
break MISSING_BLOCK_LABEL_544;
if (pePiece != null)
{
if (needsMD5CheckOnCompletion(pieceNumber))
MD5CheckPiece(pePiece, true);
List list = pePiece.getPieceWrites();
if (list.size() > 0)
{
label0:
for (int i = 0; i < pePiece.getNbBlocks(); i++)
{
List listPerBlock = pePiece.getPieceWrites(i);
byte correctHash[] = null;
Iterator iterPerBlock = listPerBlock.iterator();
do
{
if (!iterPerBlock.hasNext())
break;
PEPieceWriteImpl write = (PEPieceWriteImpl)iterPerBlock.next();
if (write.isCorrect())
correctHash = write.getHash();
} while (true);
if (correctHash == null)
continue;
iterPerBlock = listPerBlock.iterator();
do
{
PEPieceWriteImpl write;
do
{
if (!iterPerBlock.hasNext())
continue label0;
write = (PEPieceWriteImpl)iterPerBlock.next();
} while (Arrays.equals(write.getHash(), correctHash));
badPeerDetected(write.getSender(), pieceNumber);
} while (true);
}
}
}
removePiece(pePiece, pieceNumber);
sendHave(pieceNumber);
break MISSING_BLOCK_LABEL_1030;
Exception exception;
exception;
removePiece(pePiece, pieceNumber);
sendHave(pieceNumber);
throw exception;
if (outcome == 0)
if (pePiece != null)
{
try
{
MD5CheckPiece(pePiece, false);
String writers[] = pePiece.getWriters();
List uniqueWriters = new ArrayList();
int writesPerWriter[] = new int[writers.length];
for (int i = 0; i < writers.length; i++)
{
String writer = writers[i];
if (writer == null)
continue;
int writerId = uniqueWriters.indexOf(writer);
if (writerId == -1)
{
uniqueWriters.add(writer);
writerId = uniqueWriters.size() - 1;
}
writesPerWriter[writerId]++;
}
int nbWriters = uniqueWriters.size();
if (nbWriters == 1)
{
String bad_ip = (String)uniqueWriters.get(0);
PEPeerTransport bad_peer = getTransportFromAddress(bad_ip);
if (bad_peer != null)
bad_peer.sendBadPiece(pieceNumber);
badPeerDetected(bad_ip, pieceNumber);
pePiece.reset();
} else
if (nbWriters > 1)
{
int maxWrites = 0;
String bestWriter = null;
PEPeerTransport bestWriter_transport = null;
for (int i = 0; i < uniqueWriters.size(); i++)
{
int writes = writesPerWriter[i];
if (writes <= maxWrites)
continue;
String writer = (String)uniqueWriters.get(i);
PEPeerTransport pt = getTransportFromAddress(writer);
if (pt != null && pt.getReservedPieceNumber() == -1 && !ip_filter.isInRange(writer, getDisplayName(), getTorrentHash()))
{
bestWriter = writer;
maxWrites = writes;
bestWriter_transport = pt;
}
}
if (bestWriter != null)
{
pePiece.setReservedBy(bestWriter);
bestWriter_transport.setReservedPieceNumber(pePiece.getPieceNumber());
pePiece.setRequestable();
for (int i = 0; i < pePiece.getNbBlocks(); i++)
if (writers[i] == null || !writers[i].equals(bestWriter))
pePiece.reDownloadBlock(i);
} else
{
pePiece.reset();
}
} else
{
pePiece.reset();
}
piecePicker.addEndGameChunks(pePiece);
_stats.hashFailed(pePiece.getLength());
}
catch (Throwable e)
{
Debug.printStackTrace(e);
pePiece.reset();
}
} else
{
Debug.out((new StringBuilder()).append(getDisplayName()).append("Piece #").append(pieceNumber).append(" failed check and no active piece, resetting...").toString());
dm_pieces[pieceNumber].reset();
}
if (check_type == 3)
rescan_piece_time = SystemTime.getCurrentTime();
if (!seeding_mode)
checkFinished(false);
break MISSING_BLOCK_LABEL_1086;
Exception exception1;
exception1;
if (check_type == 3)
rescan_piece_time = SystemTime.getCurrentTime();
if (!seeding_mode)
checkFinished(false);
throw exception1;
}
private void badPeerDetected(String ip, int piece_number)
{
boolean hash_fail = piece_number >= 0;
PEPeerTransport peer = getTransportFromAddress(ip);
if (hash_fail && peer != null)
{
for (Iterator it = peer_manager_listeners_cow.iterator(); it.hasNext();)
try
{
((PEPeerManagerListener)it.next()).peerSentBadData(this, peer, piece_number);
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
IpFilterManager filter_manager = IpFilterManagerFactory.getSingleton();
int nbWarnings = filter_manager.getBadIps().addWarningForIp(ip);
boolean disconnect_peer = false;
if (nbWarnings > 2)
{
if (COConfigurationManager.getBooleanParameter("Ip Filter Enable Banning"))
{
if (ip_filter.ban(ip, getDisplayName(), false))
checkForBannedConnections();
if (Logger.isEnabled())
Logger.log(new LogEvent(peer, LOGID, 3, (new StringBuilder()).append(ip).append(" : has been banned and won't be able ").append("to connect until you restart azureus").toString()));
disconnect_peer = true;
}
} else
if (!hash_fail)
disconnect_peer = true;
if (disconnect_peer && peer != null)
{
int ps = peer.getPeerState();
if (ps != 40 && ps != 50)
closeAndRemovePeer(peer, (new StringBuilder()).append("has sent too many ").append(hash_fail ? "bad pieces" : "discarded blocks").append(", ").append(2).append(" max.").toString(), true);
}
}
public PEPiece[] getPieces()
{
return pePieces;
}
public PEPiece getPiece(int pieceNumber)
{
return pePieces[pieceNumber];
}
public PEPeerStats createPeerStats(PEPeer owner)
{
return new PEPeerStatsImpl(owner);
}
public DiskManagerReadRequest createDiskManagerRequest(int pieceNumber, int offset, int length)
{
return disk_mgr.createReadRequest(pieceNumber, offset, length);
}
public boolean requestExists(String peer_ip, int piece_number, int offset, int length)
{
ArrayList peer_transports = peer_transports_cow;
DiskManagerR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -