def _handle_haves(self, message_id: MessageType, payload: memoryview):
if message_id == MessageType.have:
(index,) = struct.unpack('!I', cast(bytes, payload))
self._mark_as_owner(index)
elif message_id == MessageType.bitfield:
piece_count = self._download_info.piece_count
PeerTCPClient._check_payload_len(message_id, payload, int(ceil(piece_count / 8)))
arr = bitarray(endian='big')
arr.frombytes(payload.tobytes())
for i in range(piece_count):
if arr[i]:
self._mark_as_owner(i)
for i in range(piece_count, len(arr)):
if arr[i]:
raise ValueError('Spare bits in "bitfield" message must be zero')
# if self._download_info.complete and self.is_seed():
# raise SeedError('A seed is disconnected because a download is complete')
评论列表
文章目录