BitTorrent协议(五)之下载文件

单节点下载小文件

从多个peer进行下载的算法显然是复杂的,更不用说下载一个很大的文件。这里只是简单验证一下, 从单个peer下载文件。

还是利用uTorrent软件来进行验证。

可以用之前介绍的方法来下载metadata。 获取到的info信息如下,

{'length': 1799542, 'name': 'show.gif', 'piece length': 16384, 'pieces': ['32bd6b1b19914363f3c4d6ac4aca3f8acc1fc9be', '189f81db5c5c12f21483fb24ee709ff6c08a0517', 'a3133d83aabfa6793418d3cb325012b0d4bfae46', '0e3d60244fabc21b723b8cd88f5f987d87743e89', '132157b55b0c5b7ee9a20243846eb3f1c5ac80dc', '92c37804b00d5430c67747ec5fee0868445ecd69', '5f1bb90f1ae670f7cbc3daa49d219d7d1b45acbf', '0fb09e567a1370f7903f55dff250503482de8b3e', '6dd7073806b41b4ed27d45f8dbccc0a0c10be50d', '1fcaa683cb850fce41395576c798a61e6cf905b5', 'b61629bf5a6bf0e40e67e1cbdf91bb739a02d518', 'f63a3fa985c3debb543bbcf75adeda9ab67ac9c9', 'e90e01fb4ceb645ee449ae0956cfb9308beeccb5', 'cbfa039f843f7243fb2074e465741eda474e3977', '943840bcfff18968113222d932298f813e5cc179', 'c209625e0ddf0facb53b30f4480537deadae6793', 'f71e53fb153ad59e73eeb527bb72156e747f9275', 'c5beef4d546249e731f67307904cfc78c74f1bca', '565f7f1f15a0eb25c53ca93dfb064806788b48ec', '8fef5d00ba48a62546dd2a17e8710a0cc8d2d1f9', 'f668e1c8053cc48660106013fb2b6f985e96ae2f', 'c6f2b38f8ec06b52988b2a440bdc1e113db1bf56', 'd9b628b10d349deb67e318969697311c8108c111', 'b822aecd7d71a4182e47c7c33ed507b7ba98a9ff', '8b43bb5a107942f21af0dfe93551c24ec7ed01e7', 'fbed560ff746b870aa9a341fdeeb3b2a84437b1d', '34026cdef61fe05668cb1ae45f8ca46a47539993', '1d68c176d5a8c019840d9013652c03d7118335c1', '5476b766cab277119970254a595fd69029553d09', 'f01dcc57eaf647ff9a7884e0c2ce6ce616a50e7d', '54972dab56f5e7df31dce81d44354a39c2952da7', '858184b28005ea4f11cae7b280cf964bd63c5036', 'cdc80e8a3fbd0d258dd2557aea6fdf0b778a9740', '126862f9026fae3348f19d7d285658713f545d52', '2cbd85f935a8a14de068e8284a449f3ab3345db9', 'f37dadec918d6a4295fb3ced2e5e3c06680dc138', 'b69389c850cf159cbbc50b67cce7304e48cd2fc8', '520922981a1f4752742c6b680956ea62ce98f008', '8e28d442dd20d82a88f9a17983fa2f7e704c958d', '1e3363ae14e1c0e03060a99a4f18163b1ffb07c5', 'f3237eeb35b900c3b6c7aa7e3ad33096d1717cb1', 'f287d5e00c33e65fc5c73fd0e152dfcc4c75b643', '8499d07f2fdaeebaab73c008725de0f8c7f3156f', '8e3936cf42625dfc4dd71a5128aedd051581a933', 'fe9db13341c3f7378c0cc0fe69895bd1a1635546', '86a383614a32021187439e662a0d9981d3266dac', 'e8fe2fbd7bc75f212188f30129ff2b5fbc326fc8', 'c535c7d03b83d0cee8b56c380d839de86450259d', '09317f2958a7ce16af570417dc2f4ff56b74739a', '597198e18e4fd6df0598e55ad6ac41ddd9fbfe4c', '9289b6999a360314dc5c4b5a09aec9b20aec1f13', '6611f3a373aeecfd23bbce43f3993e8b770ba550', '81fb04659a20bb00edba72c456f8ef7809dc87f3', '59496e456e24d27871fcb8127934df33925888af', '308db6c4eff529d1caa2e436cb53ad5f0ff3ed19', 'f0bb16a3f35928b6c3fcbd45227e732211e422bb', 'e0bd3d3533f9ef6051bcfe4617b45920fd42a11b', '79909209aa840c77043a2d9b2dddad042924b57e', '899e90841a27a0c2cf691e3319ddfd6b139dd28f', 'ff46286f5f16cfbc9d2d5d4d9574d842adf88d12', '5968efcadb0fa8b62702918e2bc6d109169b1688', '2a1bb615d4cb43d08f1703b6dd55b6f036843b7e', 'bc04aacea03fa3f3457a182c64c2893eed7abde3', 'ba462044856ba2355ab59f0f92a6261908495508', '58c5593a3f627c45fe995a5ad7c3abbdcd4558cb', '4d44dfa3e97ce4f5ef510f11edc8e7fdeadc0127', '76156e683a8d78dc84c9dc77b8b3295bf65ade85', '0fedc3f5cc217b1195361eb24348e3da869ee9c8', 'd135bb807f863e4341ec5dfc3ce089e3ccb90423', '9079bbc75010af82d5f820087a3d0bca68ba7335', 'f26d6acd59053b7e5c058e7e663a5aafdf08cbcd', '3a528b4e824b7e4d94eb1771d25aab1333ee4f6c', 'a378b13c679091b4f6df535e274b489a1921487a', '486a7b84e2d2826faf33fede673557abf13d4858', 'a707ce9e469a5f09bf9b20a51d36510971a8c902', 'fbf2945c8eb174e81d354ac0a217707e27d80df1', '805fbf2e06bb2780c853a5d7cb760a09bbfede41', '8077a90826ce293c28af8ec03bb9fe2bc968a87e', 'db5b68bc3ad6e1c7d9cadc0ef5336dac91ea7802', '17db99964e9e6170c12a903fddf74614f765ac63', '36a25d99fd2026aee1e93dffdab081325f6d82be', '4941159f05a9c1b5316aaebe483b68ed2b3d9bf6', '2783da31f7043a29011507c817c4469b03a7047f', '1beaf2d802cc747acf82633d6d35498e1ef1c0f2', 'd9484d93128be7f62537f24609080dbf48fc15a1', 'a3d4b391af6a4787cc2581894a9ba952a04c06af', 'f09c619843ee7bf6898fdcce47dd89c329f113b3', '9451d16f558cfeb8a65e92a74bcd627764d3b395', '2d3ac710b84c7465044994de9c07437e629ff9aa', 'a7d6d56ef412462c1f0eef2a403bf2cba615710a', '2b0804a61db331444c40c6d9817476c25438c702', '2af9e4587ee984bfa68c2e832b61d060df812d9c', 'ac75705e3f02f67e319833309af23db3aeb6e9b1', '002a18cb7b1836c01842c80107bce23f8899d046', '2d532adec4d0de4582463c8028d7b7b1797e2ad6', '4818335666c0fb4abf758fed7770f924766c08b0', '753a675a197b8b7d3d8e579172aef2f5b5987ba5', '69d335d9126f56b229304326e1bba38f48667b77', 'e57eb75086c332598025be0c424124b48f944790', '7227355ee48815247ab824d580f0d8be6722ccc8', '25872f29012b912e415165e3e04cb846cbfd5373', '2c9aea7e3dd67d8f28551fd7c3a1ea31bbe1fa5d', '64e09ec0c09b7b4c8743e1ee7899d494d9c19a99', '252b538782968f65284bf2f5cfe6a804cc877567', 'f9e9a038358f557b9780efd2899d9f9557912821', '27a6c6a7bcb3f7d53c04427f9f5bdd6c20eb78bb', '79e21154bb06d1a91da161cc75e4f75dd7df3d93', '10a8ea942ea2ce344c8b052d6a98f76825a0e13e', 'cce77357aaad177352a19d4f91ec0a35058e2e33', '48f41629e57f84ae7637b11b396c78d318f7e84d']}

这个文件的大小为1799542字节,每个片的长度是16384字节,一共110片。

通过简单计算可以知道,最后一片的长度只有13686。所以发request的消息的时候,要注意。

因为只有一个peer,简单的循环就够了。

实现的代码

代码中充斥了全局变量。


__author__ = 'ym'
"""
    Date        : '2019/1/22'
    Description :

"""
from ym.bt.peer_protocol import pack_handshake, unpack_handshake, sendall, recv, pack_extend, sha1
from ym.bt.parse_torrent import BDecode
from ym.bt.udp_announce import ip_me
import socket
import struct
import logging
from bitstring import BitArray

log = logging.getLogger()


def download(bit_field, file_data):
    try:
        info_hash = 'c99c3b7a5ba31a8966e6c9a40bc4f83887a107e5'
        ip, port = ip_me(), 40959
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        sock.connect((ip, port))

        handshake = pack_handshake(info_hash)
        rt = sendall(sock, handshake)
        if rt is None:
            raise Exception("end")
        print("sent={}, data={}".format(rt, handshake))
        data = recv(sock, 68)

        tup = unpack_handshake(data)
        if tup is None:
            raise Exception("end")
        print(tup)

        UT_METADATA_ID = 1
        dic = {'m': {'ut_metadata': UT_METADATA_ID}}
        ext_handshake = pack_extend(dic, id=20, ext_id=0)  # 扩展协议的握手消息
        sock.sendall(ext_handshake)
        print("sent|ext_handshake={}".format(ext_handshake))

        while True:
            data = recv(sock, 4)
            if data is None:
                raise Exception("end")
            num, = struct.unpack(">i", data)

            if num == 0:
                continue

            tmp = recv(sock, 1)

            if tmp is None:
                raise Exception("end")
            id, = struct.unpack(">B", tmp)
            # print("id={}".format(id))
            tmp = recv(sock, int(num) - 1)
            # print("recv={}".format(tmp))
            if id == 5:
                # bitfield
                if bit_field is None:
                    bit_field = BitArray(tmp)
                    file_data = [None] * 110  # pieces num
                print(bit_field.bin)

                # interested
                send_interested(sock)
            elif id == 4:
                # have
                index, = struct.unpack(">i", tmp)
                # print("index={}".format(index))
                if bit_field.bin[index] == '0':
                    bit_field.set('1', index)
                    # print(bitfield.bin)

            elif id == 1:
                # unchoke
                print("unchoke")
                send_request(bit_field, file_data, sock)
            elif id == 7:
                # piece
                print("piece")
                index, begin = struct.unpack(">i i", tmp[0:8])
                print("index={}, begin={}".format(index, begin))
                print(len(tmp[8:]))
                file_data[index] = tmp[8:]
                if index == 109:
                    print("completed.")
                    return bit_field, file_data

                send_request(bit_field, file_data, sock)

            elif id == 20:
                #
                ext_id, = struct.unpack(">B", tmp[0:1])
                if ext_id == 0:
                    # 扩展握手消息
                    dic, i, n = BDecode(tmp[1:]).parse()
                    print(dic)
                else:
                    pass
            else:
                pass

    except Exception as e:
        log.exception(e)

    return (bit_field, file_data)


def send_interested(sock):
    data = struct.pack(">i B", 1, 2)
    rt = sendall(sock, data)
    if rt is None:
        raise Exception("end")
    print("interested={}".format(data))


def send_request(bit_field, file_data, sock):
    index = find_one(bit_field.bin, file_data)
    if index is None:
        raise Exception("end")
    print("request piece={}".format(index))
    data = pack_request(index)
    if index == 109:
        data = pack_request(index, begin=0, length=13686)
    rt = sendall(sock, data)
    if rt is None:
        raise Exception("end")
    print("sent={}".format(data))


def find_one(bit_array: str, file_data: list):
    i = 0
    while i < len(file_data):
        if file_data[i] is None and bit_array[i] == '1':
            break
        i += 1

    if i == len(file_data):
        return None
    else:
        return i


def pack_request(index, begin=0, length=16384):
    return struct.pack(">i B i i i", 13, 6, index, begin, length)


def not_finish(file_data):
    if file_data is None:
        return True

    for item in file_data:
        if item is None:
            return True

    return False


def main():
    bit_field = None
    file_data = None
    while not_finish(file_data):
        bit_field, file_data = download(bit_field, file_data)

    print(bit_field)
    output = '/Users/ym/tmp/copy.gif'
    expected = {'length': 1799542, 'name': 'show.gif', 'piece length': 16384,
                'pieces': ['32bd6b1b19914363f3c4d6ac4aca3f8acc1fc9be', '189f81db5c5c12f21483fb24ee709ff6c08a0517',
                           'a3133d83aabfa6793418d3cb325012b0d4bfae46', '0e3d60244fabc21b723b8cd88f5f987d87743e89',
                           '132157b55b0c5b7ee9a20243846eb3f1c5ac80dc', '92c37804b00d5430c67747ec5fee0868445ecd69',
                           '5f1bb90f1ae670f7cbc3daa49d219d7d1b45acbf', '0fb09e567a1370f7903f55dff250503482de8b3e',
                           '6dd7073806b41b4ed27d45f8dbccc0a0c10be50d', '1fcaa683cb850fce41395576c798a61e6cf905b5',
                           'b61629bf5a6bf0e40e67e1cbdf91bb739a02d518', 'f63a3fa985c3debb543bbcf75adeda9ab67ac9c9',
                           'e90e01fb4ceb645ee449ae0956cfb9308beeccb5', 'cbfa039f843f7243fb2074e465741eda474e3977',
                           '943840bcfff18968113222d932298f813e5cc179', 'c209625e0ddf0facb53b30f4480537deadae6793',
                           'f71e53fb153ad59e73eeb527bb72156e747f9275', 'c5beef4d546249e731f67307904cfc78c74f1bca',
                           '565f7f1f15a0eb25c53ca93dfb064806788b48ec', '8fef5d00ba48a62546dd2a17e8710a0cc8d2d1f9',
                           'f668e1c8053cc48660106013fb2b6f985e96ae2f', 'c6f2b38f8ec06b52988b2a440bdc1e113db1bf56',
                           'd9b628b10d349deb67e318969697311c8108c111', 'b822aecd7d71a4182e47c7c33ed507b7ba98a9ff',
                           '8b43bb5a107942f21af0dfe93551c24ec7ed01e7', 'fbed560ff746b870aa9a341fdeeb3b2a84437b1d',
                           '34026cdef61fe05668cb1ae45f8ca46a47539993', '1d68c176d5a8c019840d9013652c03d7118335c1',
                           '5476b766cab277119970254a595fd69029553d09', 'f01dcc57eaf647ff9a7884e0c2ce6ce616a50e7d',
                           '54972dab56f5e7df31dce81d44354a39c2952da7', '858184b28005ea4f11cae7b280cf964bd63c5036',
                           'cdc80e8a3fbd0d258dd2557aea6fdf0b778a9740', '126862f9026fae3348f19d7d285658713f545d52',
                           '2cbd85f935a8a14de068e8284a449f3ab3345db9', 'f37dadec918d6a4295fb3ced2e5e3c06680dc138',
                           'b69389c850cf159cbbc50b67cce7304e48cd2fc8', '520922981a1f4752742c6b680956ea62ce98f008',
                           '8e28d442dd20d82a88f9a17983fa2f7e704c958d', '1e3363ae14e1c0e03060a99a4f18163b1ffb07c5',
                           'f3237eeb35b900c3b6c7aa7e3ad33096d1717cb1', 'f287d5e00c33e65fc5c73fd0e152dfcc4c75b643',
                           '8499d07f2fdaeebaab73c008725de0f8c7f3156f', '8e3936cf42625dfc4dd71a5128aedd051581a933',
                           'fe9db13341c3f7378c0cc0fe69895bd1a1635546', '86a383614a32021187439e662a0d9981d3266dac',
                           'e8fe2fbd7bc75f212188f30129ff2b5fbc326fc8', 'c535c7d03b83d0cee8b56c380d839de86450259d',
                           '09317f2958a7ce16af570417dc2f4ff56b74739a', '597198e18e4fd6df0598e55ad6ac41ddd9fbfe4c',
                           '9289b6999a360314dc5c4b5a09aec9b20aec1f13', '6611f3a373aeecfd23bbce43f3993e8b770ba550',
                           '81fb04659a20bb00edba72c456f8ef7809dc87f3', '59496e456e24d27871fcb8127934df33925888af',
                           '308db6c4eff529d1caa2e436cb53ad5f0ff3ed19', 'f0bb16a3f35928b6c3fcbd45227e732211e422bb',
                           'e0bd3d3533f9ef6051bcfe4617b45920fd42a11b', '79909209aa840c77043a2d9b2dddad042924b57e',
                           '899e90841a27a0c2cf691e3319ddfd6b139dd28f', 'ff46286f5f16cfbc9d2d5d4d9574d842adf88d12',
                           '5968efcadb0fa8b62702918e2bc6d109169b1688', '2a1bb615d4cb43d08f1703b6dd55b6f036843b7e',
                           'bc04aacea03fa3f3457a182c64c2893eed7abde3', 'ba462044856ba2355ab59f0f92a6261908495508',
                           '58c5593a3f627c45fe995a5ad7c3abbdcd4558cb', '4d44dfa3e97ce4f5ef510f11edc8e7fdeadc0127',
                           '76156e683a8d78dc84c9dc77b8b3295bf65ade85', '0fedc3f5cc217b1195361eb24348e3da869ee9c8',
                           'd135bb807f863e4341ec5dfc3ce089e3ccb90423', '9079bbc75010af82d5f820087a3d0bca68ba7335',
                           'f26d6acd59053b7e5c058e7e663a5aafdf08cbcd', '3a528b4e824b7e4d94eb1771d25aab1333ee4f6c',
                           'a378b13c679091b4f6df535e274b489a1921487a', '486a7b84e2d2826faf33fede673557abf13d4858',
                           'a707ce9e469a5f09bf9b20a51d36510971a8c902', 'fbf2945c8eb174e81d354ac0a217707e27d80df1',
                           '805fbf2e06bb2780c853a5d7cb760a09bbfede41', '8077a90826ce293c28af8ec03bb9fe2bc968a87e',
                           'db5b68bc3ad6e1c7d9cadc0ef5336dac91ea7802', '17db99964e9e6170c12a903fddf74614f765ac63',
                           '36a25d99fd2026aee1e93dffdab081325f6d82be', '4941159f05a9c1b5316aaebe483b68ed2b3d9bf6',
                           '2783da31f7043a29011507c817c4469b03a7047f', '1beaf2d802cc747acf82633d6d35498e1ef1c0f2',
                           'd9484d93128be7f62537f24609080dbf48fc15a1', 'a3d4b391af6a4787cc2581894a9ba952a04c06af',
                           'f09c619843ee7bf6898fdcce47dd89c329f113b3', '9451d16f558cfeb8a65e92a74bcd627764d3b395',
                           '2d3ac710b84c7465044994de9c07437e629ff9aa', 'a7d6d56ef412462c1f0eef2a403bf2cba615710a',
                           '2b0804a61db331444c40c6d9817476c25438c702', '2af9e4587ee984bfa68c2e832b61d060df812d9c',
                           'ac75705e3f02f67e319833309af23db3aeb6e9b1', '002a18cb7b1836c01842c80107bce23f8899d046',
                           '2d532adec4d0de4582463c8028d7b7b1797e2ad6', '4818335666c0fb4abf758fed7770f924766c08b0',
                           '753a675a197b8b7d3d8e579172aef2f5b5987ba5', '69d335d9126f56b229304326e1bba38f48667b77',
                           'e57eb75086c332598025be0c424124b48f944790', '7227355ee48815247ab824d580f0d8be6722ccc8',
                           '25872f29012b912e415165e3e04cb846cbfd5373', '2c9aea7e3dd67d8f28551fd7c3a1ea31bbe1fa5d',
                           '64e09ec0c09b7b4c8743e1ee7899d494d9c19a99', '252b538782968f65284bf2f5cfe6a804cc877567',
                           'f9e9a038358f557b9780efd2899d9f9557912821', '27a6c6a7bcb3f7d53c04427f9f5bdd6c20eb78bb',
                           '79e21154bb06d1a91da161cc75e4f75dd7df3d93', '10a8ea942ea2ce344c8b052d6a98f76825a0e13e',
                           'cce77357aaad177352a19d4f91ec0a35058e2e33', '48f41629e57f84ae7637b11b396c78d318f7e84d']}

    with open(output, "wb+") as f:
        for i in range(len(file_data)):
            file_datum = file_data[i]
            if sha1(file_datum) != expected['pieces'][i]:
                raise Exception("error hash")
            f.write(file_datum)
    print("download ok.")


if __name__ == '__main__':
    main()


运行日志

以下是运行日志。

/usr/local/bin/python3.7 /Users/ym/charm/pytest/ym/bt/bt_download_data.py
sent=ok, data=b'\x13BitTorrent protocol\x00\x00\x00\x00\x00\x10\x00\x01\xc9\x9c;z[\xa3\x1a\x89f\xe6\xc9\xa4\x0b\xc4\xf88\x87\xa1\x07\xe5ym111111111111111111'
Handshake(fixed_num=19, bt_head=b'BitTorrent protocol', reserved=b'\x00\x00\x00\x00\x00\x10\x00\x05', info_hash=b'\xc9\x9c;z[\xa3\x1a\x89f\xe6\xc9\xa4\x0b\xc4\xf88\x87\xa1\x07\xe5', peer_id=b'-UM1870-\x14\xab,SS\x82\x1d\x9crh\xc8d')
sent|ext_handshake=b'\x00\x00\x00\x1a\x14\x00d1:md11:ut_metadatai1eee'
{'e': 0, 'ipv4': 'ށ\x01\x14', 'ipv6': 'þ€\x00\x00\x00\x00\x00\x00\x04:^:D[\x0c’', 'complete_ago': 1, 'm': {'upload_only': 3, 'ut_holepunch': 4, 'ut_metadata': 2, 'ut_pex': 1, 'ut_recommend': 5, 'ut_comment': 6}, 'metadata_size': 2270, 'p': 40959, 'reqq': 255, 'v': 'µTorrent Mac 1.8.7', 'yourip': 'À¨+R'}
0111111101110111110111111111111111111101110111110011100111010110011111011111110101101110101101111000111111111100
interested=b'\x00\x00\x00\x01\x02'
unchoke
request piece=0
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00'
piece
index=0, begin=0
16384
request piece=1
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00@\x00'
piece
index=1, begin=0
16384
request piece=2
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00@\x00'
piece
index=2, begin=0
16384
request piece=3
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00@\x00'
piece
index=3, begin=0
16384
request piece=4
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00@\x00'
piece
index=4, begin=0
16384
request piece=5
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00@\x00'
piece
index=5, begin=0
16384
request piece=6
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00@\x00'
piece
index=6, begin=0
16384
request piece=7
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00@\x00'
piece
index=7, begin=0
16384
request piece=8
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00@\x00'
piece
index=8, begin=0
16384
request piece=9
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\t\x00\x00\x00\x00\x00\x00@\x00'
piece
index=9, begin=0
16384
request piece=10
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\n\x00\x00\x00\x00\x00\x00@\x00'
piece
index=10, begin=0
16384
request piece=11
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00@\x00'
piece
index=11, begin=0
16384
request piece=12
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00@\x00'
piece
index=12, begin=0
16384
request piece=13
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\r\x00\x00\x00\x00\x00\x00@\x00'
piece
index=13, begin=0
16384
request piece=14
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00@\x00'
piece
index=14, begin=0
16384
request piece=15
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00@\x00'
piece
index=15, begin=0
16384
request piece=16
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00@\x00'
piece
index=16, begin=0
16384
request piece=17
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00@\x00'
piece
index=17, begin=0
16384
request piece=18
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00@\x00'
piece
index=18, begin=0
16384
request piece=19
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00@\x00'
piece
index=19, begin=0
16384
request piece=20
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00@\x00'
piece
index=20, begin=0
16384
request piece=21
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00@\x00'
piece
index=21, begin=0
16384
request piece=22
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00@\x00'
piece
index=22, begin=0
16384
request piece=23
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00@\x00'
piece
index=23, begin=0
16384
request piece=24
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00@\x00'
piece
index=24, begin=0
16384
request piece=25
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00@\x00'
piece
index=25, begin=0
16384
request piece=26
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00@\x00'
piece
index=26, begin=0
16384
request piece=27
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00@\x00'
piece
index=27, begin=0
16384
request piece=28
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00@\x00'
piece
index=28, begin=0
16384
request piece=29
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00@\x00'
piece
index=29, begin=0
16384
request piece=30
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00@\x00'
piece
index=30, begin=0
16384
request piece=31
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00@\x00'
piece
index=31, begin=0
16384
request piece=32
sent=b'\x00\x00\x00\r\x06\x00\x00\x00 \x00\x00\x00\x00\x00\x00@\x00'
piece
index=32, begin=0
16384
request piece=33
sent=b'\x00\x00\x00\r\x06\x00\x00\x00!\x00\x00\x00\x00\x00\x00@\x00'
piece
index=33, begin=0
16384
request piece=34
sent=b'\x00\x00\x00\r\x06\x00\x00\x00"\x00\x00\x00\x00\x00\x00@\x00'
piece
index=34, begin=0
16384
request piece=35
sent=b'\x00\x00\x00\r\x06\x00\x00\x00#\x00\x00\x00\x00\x00\x00@\x00'
piece
index=35, begin=0
16384
request piece=36
sent=b'\x00\x00\x00\r\x06\x00\x00\x00$\x00\x00\x00\x00\x00\x00@\x00'
piece
index=36, begin=0
16384
request piece=37
sent=b'\x00\x00\x00\r\x06\x00\x00\x00%\x00\x00\x00\x00\x00\x00@\x00'
piece
index=37, begin=0
16384
request piece=38
sent=b'\x00\x00\x00\r\x06\x00\x00\x00&\x00\x00\x00\x00\x00\x00@\x00'
piece
index=38, begin=0
16384
request piece=39
sent=b"\x00\x00\x00\r\x06\x00\x00\x00'\x00\x00\x00\x00\x00\x00@\x00"
piece
index=39, begin=0
16384
request piece=40
sent=b'\x00\x00\x00\r\x06\x00\x00\x00(\x00\x00\x00\x00\x00\x00@\x00'
piece
index=40, begin=0
16384
request piece=41
sent=b'\x00\x00\x00\r\x06\x00\x00\x00)\x00\x00\x00\x00\x00\x00@\x00'
piece
index=41, begin=0
16384
request piece=42
sent=b'\x00\x00\x00\r\x06\x00\x00\x00*\x00\x00\x00\x00\x00\x00@\x00'
piece
index=42, begin=0
16384
request piece=43
sent=b'\x00\x00\x00\r\x06\x00\x00\x00+\x00\x00\x00\x00\x00\x00@\x00'
piece
index=43, begin=0
16384
request piece=44
sent=b'\x00\x00\x00\r\x06\x00\x00\x00,\x00\x00\x00\x00\x00\x00@\x00'
piece
index=44, begin=0
16384
request piece=45
sent=b'\x00\x00\x00\r\x06\x00\x00\x00-\x00\x00\x00\x00\x00\x00@\x00'
piece
index=45, begin=0
16384
request piece=46
sent=b'\x00\x00\x00\r\x06\x00\x00\x00.\x00\x00\x00\x00\x00\x00@\x00'
piece
index=46, begin=0
16384
request piece=47
sent=b'\x00\x00\x00\r\x06\x00\x00\x00/\x00\x00\x00\x00\x00\x00@\x00'
piece
index=47, begin=0
16384
request piece=48
sent=b'\x00\x00\x00\r\x06\x00\x00\x000\x00\x00\x00\x00\x00\x00@\x00'
piece
index=48, begin=0
16384
request piece=49
sent=b'\x00\x00\x00\r\x06\x00\x00\x001\x00\x00\x00\x00\x00\x00@\x00'
piece
index=49, begin=0
16384
request piece=50
sent=b'\x00\x00\x00\r\x06\x00\x00\x002\x00\x00\x00\x00\x00\x00@\x00'
piece
index=50, begin=0
16384
request piece=51
sent=b'\x00\x00\x00\r\x06\x00\x00\x003\x00\x00\x00\x00\x00\x00@\x00'
piece
index=51, begin=0
16384
request piece=52
sent=b'\x00\x00\x00\r\x06\x00\x00\x004\x00\x00\x00\x00\x00\x00@\x00'
piece
index=52, begin=0
16384
request piece=53
sent=b'\x00\x00\x00\r\x06\x00\x00\x005\x00\x00\x00\x00\x00\x00@\x00'
piece
index=53, begin=0
16384
request piece=54
sent=b'\x00\x00\x00\r\x06\x00\x00\x006\x00\x00\x00\x00\x00\x00@\x00'
piece
index=54, begin=0
16384
request piece=55
sent=b'\x00\x00\x00\r\x06\x00\x00\x007\x00\x00\x00\x00\x00\x00@\x00'
piece
index=55, begin=0
16384
request piece=56
sent=b'\x00\x00\x00\r\x06\x00\x00\x008\x00\x00\x00\x00\x00\x00@\x00'
piece
index=56, begin=0
16384
request piece=57
sent=b'\x00\x00\x00\r\x06\x00\x00\x009\x00\x00\x00\x00\x00\x00@\x00'
piece
index=57, begin=0
16384
request piece=58
sent=b'\x00\x00\x00\r\x06\x00\x00\x00:\x00\x00\x00\x00\x00\x00@\x00'
piece
index=58, begin=0
16384
request piece=59
sent=b'\x00\x00\x00\r\x06\x00\x00\x00;\x00\x00\x00\x00\x00\x00@\x00'
piece
index=59, begin=0
16384
request piece=60
sent=b'\x00\x00\x00\r\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00@\x00'
piece
index=60, begin=0
16384
request piece=61
sent=b'\x00\x00\x00\r\x06\x00\x00\x00=\x00\x00\x00\x00\x00\x00@\x00'
piece
index=61, begin=0
16384
request piece=62
sent=b'\x00\x00\x00\r\x06\x00\x00\x00>\x00\x00\x00\x00\x00\x00@\x00'
piece
index=62, begin=0
16384
request piece=63
sent=b'\x00\x00\x00\r\x06\x00\x00\x00?\x00\x00\x00\x00\x00\x00@\x00'
piece
index=63, begin=0
16384
request piece=64
sent=b'\x00\x00\x00\r\x06\x00\x00\x00@\x00\x00\x00\x00\x00\x00@\x00'
piece
index=64, begin=0
16384
request piece=65
sent=b'\x00\x00\x00\r\x06\x00\x00\x00A\x00\x00\x00\x00\x00\x00@\x00'
piece
index=65, begin=0
16384
request piece=66
sent=b'\x00\x00\x00\r\x06\x00\x00\x00B\x00\x00\x00\x00\x00\x00@\x00'
piece
index=66, begin=0
16384
request piece=67
sent=b'\x00\x00\x00\r\x06\x00\x00\x00C\x00\x00\x00\x00\x00\x00@\x00'
piece
index=67, begin=0
16384
request piece=68
sent=b'\x00\x00\x00\r\x06\x00\x00\x00D\x00\x00\x00\x00\x00\x00@\x00'
piece
index=68, begin=0
16384
request piece=69
sent=b'\x00\x00\x00\r\x06\x00\x00\x00E\x00\x00\x00\x00\x00\x00@\x00'
piece
index=69, begin=0
16384
request piece=70
sent=b'\x00\x00\x00\r\x06\x00\x00\x00F\x00\x00\x00\x00\x00\x00@\x00'
piece
index=70, begin=0
16384
request piece=71
sent=b'\x00\x00\x00\r\x06\x00\x00\x00G\x00\x00\x00\x00\x00\x00@\x00'
piece
index=71, begin=0
16384
request piece=72
sent=b'\x00\x00\x00\r\x06\x00\x00\x00H\x00\x00\x00\x00\x00\x00@\x00'
piece
index=72, begin=0
16384
request piece=73
sent=b'\x00\x00\x00\r\x06\x00\x00\x00I\x00\x00\x00\x00\x00\x00@\x00'
piece
index=73, begin=0
16384
request piece=74
sent=b'\x00\x00\x00\r\x06\x00\x00\x00J\x00\x00\x00\x00\x00\x00@\x00'
piece
index=74, begin=0
16384
request piece=75
sent=b'\x00\x00\x00\r\x06\x00\x00\x00K\x00\x00\x00\x00\x00\x00@\x00'
piece
index=75, begin=0
16384
request piece=76
sent=b'\x00\x00\x00\r\x06\x00\x00\x00L\x00\x00\x00\x00\x00\x00@\x00'
piece
index=76, begin=0
16384
request piece=77
sent=b'\x00\x00\x00\r\x06\x00\x00\x00M\x00\x00\x00\x00\x00\x00@\x00'
piece
index=77, begin=0
16384
request piece=78
sent=b'\x00\x00\x00\r\x06\x00\x00\x00N\x00\x00\x00\x00\x00\x00@\x00'
piece
index=78, begin=0
16384
request piece=79
sent=b'\x00\x00\x00\r\x06\x00\x00\x00O\x00\x00\x00\x00\x00\x00@\x00'
piece
index=79, begin=0
16384
request piece=80
sent=b'\x00\x00\x00\r\x06\x00\x00\x00P\x00\x00\x00\x00\x00\x00@\x00'
piece
index=80, begin=0
16384
request piece=81
sent=b'\x00\x00\x00\r\x06\x00\x00\x00Q\x00\x00\x00\x00\x00\x00@\x00'
piece
index=81, begin=0
16384
request piece=82
sent=b'\x00\x00\x00\r\x06\x00\x00\x00R\x00\x00\x00\x00\x00\x00@\x00'
piece
index=82, begin=0
16384
request piece=83
sent=b'\x00\x00\x00\r\x06\x00\x00\x00S\x00\x00\x00\x00\x00\x00@\x00'
piece
index=83, begin=0
16384
request piece=84
sent=b'\x00\x00\x00\r\x06\x00\x00\x00T\x00\x00\x00\x00\x00\x00@\x00'
piece
index=84, begin=0
16384
request piece=85
sent=b'\x00\x00\x00\r\x06\x00\x00\x00U\x00\x00\x00\x00\x00\x00@\x00'
piece
index=85, begin=0
16384
request piece=86
sent=b'\x00\x00\x00\r\x06\x00\x00\x00V\x00\x00\x00\x00\x00\x00@\x00'
piece
index=86, begin=0
16384
request piece=87
sent=b'\x00\x00\x00\r\x06\x00\x00\x00W\x00\x00\x00\x00\x00\x00@\x00'
piece
index=87, begin=0
16384
request piece=88
sent=b'\x00\x00\x00\r\x06\x00\x00\x00X\x00\x00\x00\x00\x00\x00@\x00'
piece
index=88, begin=0
16384
request piece=89
sent=b'\x00\x00\x00\r\x06\x00\x00\x00Y\x00\x00\x00\x00\x00\x00@\x00'
piece
index=89, begin=0
16384
request piece=90
sent=b'\x00\x00\x00\r\x06\x00\x00\x00Z\x00\x00\x00\x00\x00\x00@\x00'
piece
index=90, begin=0
16384
request piece=91
sent=b'\x00\x00\x00\r\x06\x00\x00\x00[\x00\x00\x00\x00\x00\x00@\x00'
piece
index=91, begin=0
16384
request piece=92
sent=b'\x00\x00\x00\r\x06\x00\x00\x00\\\x00\x00\x00\x00\x00\x00@\x00'
piece
index=92, begin=0
16384
request piece=93
sent=b'\x00\x00\x00\r\x06\x00\x00\x00]\x00\x00\x00\x00\x00\x00@\x00'
piece
index=93, begin=0
16384
request piece=94
sent=b'\x00\x00\x00\r\x06\x00\x00\x00^\x00\x00\x00\x00\x00\x00@\x00'
piece
index=94, begin=0
16384
request piece=95
sent=b'\x00\x00\x00\r\x06\x00\x00\x00_\x00\x00\x00\x00\x00\x00@\x00'
piece
index=95, begin=0
16384
request piece=96
sent=b'\x00\x00\x00\r\x06\x00\x00\x00`\x00\x00\x00\x00\x00\x00@\x00'
piece
index=96, begin=0
16384
request piece=97
sent=b'\x00\x00\x00\r\x06\x00\x00\x00a\x00\x00\x00\x00\x00\x00@\x00'
piece
index=97, begin=0
16384
request piece=98
sent=b'\x00\x00\x00\r\x06\x00\x00\x00b\x00\x00\x00\x00\x00\x00@\x00'
piece
index=98, begin=0
16384
request piece=99
sent=b'\x00\x00\x00\r\x06\x00\x00\x00c\x00\x00\x00\x00\x00\x00@\x00'
piece
index=99, begin=0
16384
request piece=100
sent=b'\x00\x00\x00\r\x06\x00\x00\x00d\x00\x00\x00\x00\x00\x00@\x00'
piece
index=100, begin=0
16384
request piece=101
sent=b'\x00\x00\x00\r\x06\x00\x00\x00e\x00\x00\x00\x00\x00\x00@\x00'
piece
index=101, begin=0
16384
request piece=102
sent=b'\x00\x00\x00\r\x06\x00\x00\x00f\x00\x00\x00\x00\x00\x00@\x00'
piece
index=102, begin=0
16384
request piece=103
sent=b'\x00\x00\x00\r\x06\x00\x00\x00g\x00\x00\x00\x00\x00\x00@\x00'
piece
index=103, begin=0
16384
request piece=104
sent=b'\x00\x00\x00\r\x06\x00\x00\x00h\x00\x00\x00\x00\x00\x00@\x00'
piece
index=104, begin=0
16384
request piece=105
sent=b'\x00\x00\x00\r\x06\x00\x00\x00i\x00\x00\x00\x00\x00\x00@\x00'
piece
index=105, begin=0
16384
request piece=106
sent=b'\x00\x00\x00\r\x06\x00\x00\x00j\x00\x00\x00\x00\x00\x00@\x00'
piece
index=106, begin=0
16384
request piece=107
sent=b'\x00\x00\x00\r\x06\x00\x00\x00k\x00\x00\x00\x00\x00\x00@\x00'
piece
index=107, begin=0
16384
request piece=108
sent=b'\x00\x00\x00\r\x06\x00\x00\x00l\x00\x00\x00\x00\x00\x00@\x00'
piece
index=108, begin=0
16384
request piece=109
sent=b'\x00\x00\x00\r\x06\x00\x00\x00m\x00\x00\x00\x00\x00\x005v'
piece
index=109, begin=0
13686
completed.
0xfffffffffffffffffffffffffffc
download ok.

Process finished with exit code 0