欠陥ピースをチェックする方法。
ファイルの "piece length"バイト分のSHA hash値と、メタ情報ファイル(.torrent)に含まれる metainfo["info"]["pieces"] の 20 bytesを比較するとチェックできるらしい。
BEncodingのソースは以前載せたので、.torrentのデコードにはそれを利用して。
require 'digest/sha1' # fh .. ファイル ハンドル # pieces .. メタ情報ファイルの meta["info"]["pieces"] # piece_length .. メタ情報ファイル内の meta["info"]["piece length"].to_i def check_pieces(fh, pieces, piece_length) pieces = pieces.scan(/(.{20})/m) for index in (0...pieces.length) a = Digest.SHA1.digest( fh.read(piece_length) ) b = pieces[index] print (a == b) ? "*" : "X" end end
公式のpythonクライアントでは、StorageWrapperのhave(BitField)をチェックするとどのピースが欠けているかをチェックできるらしい。(IRC#bittorrentで聞いた方法)
# StorageWrapper.__init__の最後の方に追加 for i in range(len(self.have)): if self.have[i]: print "%d have" % i else: print "%d not have" % i