bittorrent peer wire 下载元数据,bdecode 失败

bittorrent peer wire download metadata,bdecode fail

我写了一个蜘蛛,握手和扩展握手都可以,我成功下载了元数据但是当 bdecode 时,除了 failnot a valid bencoded string

我收到这样的数据:

b'\x00\x00</\x14\x01d8:msg_typei1e5:piecei0e10:total_sizei15360eed6:lengthi800927755e4:name12:Zet9 Geo.rar12:piece lengthi1048576e6:pieces15280:3}\xdf\xd64\x90\x15z\x96aN\xe1\x08\xffU\x8c\xbd0m\xc0\xbb\x16\xd5\x13\xad\x9e\xb4\xa1\x1c\x02s\xe2\xc2\x1f\x11\xab\x1c-\xe0\x89{\xd8G\xfbFN\x0e~\xce\xb6pWG!%\xc4\xa3O<{^y0\'\xad\x92\xd2\xf3\xb7Hadq\xc3\x13"\xed\xdb\xfdx}\x05\x0e\xcd\x1e\xfc\xf4\xdc5\x80N\xe8\x8b\xbc\\x10\x82\xf3i\x08\x81U\xa6\xb0\xf67\xb8\xaa\xebx\xe2\xe9jNv\x87\xfb\x0c\xb9\xc5s~\x0f{\x8f\xa4\xa8\x95\x08\xd9\r,X\nz\x9d\x87\x1e/\x1a\x00\x8d\xb3\xbc\x14\x08\xc7\x80\x0b\xecO\xb4M]\x81\xfa\xe1\xb02 C\x8e\xda\xe2)K\xcf\xdf\xee}>\x16\x95\x11|8\x87\x94J<\xe9%\t\xfc!\x12\xe8>\nWR\xb3\x8fp\xeaZ\xb9\xcb\xc9\xe0J\xe6\x91\xde\x08\xd8\x86\x90~\xe3{j\xd0\xbd\x11\xf8\x8f\x9c}\xdc\x13\xd8\xeb\x0c\x06\xb6v\t\x0f_4\x8c\xc2\xe4jn\xcf\xd2\x1bF\xc2\xd3\xd2fz\xa1:z=\xc9;N\x1f\xa6r\xc1\x9fPi\x88g\xd7\xe8\xf1\x15\xee\xbbkLo\xa8\x13\x03p\xc5\x9e\x18\xdc+\xf5\xe1\xe6\x15\xc7(\x83\x050F\xdb\xe3\xc5n\x08\xb6LJk\x15\xb8\xad\xbaM\xb3\x8d\xf8U\xcc\5/}_\t1\x15\x91\x96\xaa7\xbd,4SL8\xb9_\xb5\x9f3\x93\xce\xff\x08\x18J\xafXy\x11\x8cD\xed\x88\x17\x1a\xa2\xc5e+\xa0\xb4X\xc4\xacsq\xce6\xb2\xce\x8f\x93\xffK\xefn}\x93\xb3!l\x19~\xea\x02\xb3\x8ag\xbeR\x05z\xa7\xac \x19\xc3E\x07~\x06\x8b#5oW\x80\xe5\xa0pQ\x01Y\x9e\xf2\x0e\xa7\xb6\x14\x14\xb9\xb6C\xee(-\xb6\xeb\x12\xa8\xbdVEt#\x99sg_G\xa1\xc1\x10[\xb7CM>R\x82O\xca\x8b\xce\xa5g\xb0\xe9\xad\xa4\xfe0\x8d\x15Emx\x9e\x97\xa3\x037\x83p\xe9{\xe7\xd5\xabx\xfd\xb97l\x1av\xac?\xe4\x1e>.\xd1\xe3\xb7\x81$\t\xfc3\xccr\xe7\xb5\x8dO\x81\xa2\xc8\xfa\x15\x16\xeaR\xeb\x92\x9a* \x81\xca\x90\x03\xa6\xcb:2HX;\xea\xefu\x0eS\xed\x9cZ\xce< \xdf\xfc\xe0\xbc\xff\xda\x916[\x1afl\xe3?\xde\x1a\xbb\xba\xdb\xa4E\x8aR\x11\x9a\xd0|\xb5\x92\x8e\xe6h2-\xe8\x00O\x14\xd5\xb6uk\xa7\xd8"u\x9c\x860\xa5%\xb7\x107^\xc0\xfcJ\xcaA\x8c\xd4\x12\x97\x9eE\x1a\xc5.\x93\xd4\xa3\xdd\n\xfcG\x98r\xb3ck?Gj\xcc\xf6F\xe6`\xd3\xc9\xe5\t\x1aA]\xdd\x01\x1f\xba\xecw\x81\xb6\x0eR\x8a\xdaR\x10\xd5\xae\x92\x003h<`\xe3\xc6\xd5r\xd0\xa4\xc4M2\x1d\xb0\x07+\x9c\xd6\x01\xe1eR\xbaO\x0f\xddo\xb6BM\xa8A:\x7f\x05|I\x16I~\xfbM@\xe7~\xdb\xd8*q!>\\x1d3nB\xb5&f4D\xcc\xc7_\x03\xa9\xde\xe1\xab1\xd9\xf9\xde\xc6\xae\xf1\x9a}\xdaa4\x1a\x95(S\xf5\xceP\xc2\xf2\xbf\xc8\x01\xe9\xd9\x17\xc2)\x17\xf03\xfcv\n\xe9a\x9f\xda\xf2\x844\xfb$c\xb3mdC^^\xc1=>]\xa5\xefn/)\x00\x1a\xc8\xa0L\xe6\x07\xf8\x0b\xaf8\x18\xac\x02\xe9\x85\xa6=S\x95\x98\xd0\xd7\nA+\xff\x97\\xa69\xcb(<W\r\xa2\x93]\t\xb6~\xf0\xd5\xb1.\x9b\xf1\xa0\xb2P\xe4%\x8b\x1b\xf7\xfe`\x8c\xae\xf8\xa5\xc1e\xe1`h\n\xb2d\x0e\x05\x07\xc03\x9crZ\xca\x1fg\x83r\x0b]2\xb6\x19\x18m\x8b0T\xc58\x94\x13\x14A\x1d\x17?\x07m\xe1\x8eZ[\rUXN\xc4\xcbK\xdd\xb9\xf3\x04\xd1\x9e\xa8\x04\xc4\xdd\xd3/O$v\xf5\xd5M\xdbd\xc0\xfcF>\xa3\x11\x14\x9bw\xe4\xeb-0\xc0y\xf6\xcc\xfc\x89+,\xeb\xdbx\x0f\xb4\x13\xfc\x86X\x98\x95\x1c\x15|^:\xf7\x0e\xe07\x8f\x18Vi\x86\x1b(\x19n\x08e\S>\xb8\x154\xd1T\xcd\xa1\xa8\xca\xa2\xaa\xb1G\x03\xb1A\xda\xcaz\x07\xe1\xd5\xc5\xfayR\xdc7\xf9[\x15~\x83_W\x8cn2\x8f\xaf\xa0\xb73+\xefZ@\x04<\xa4\x99@\xac\x99\xc4\xc7\xae\x8b\x93\xa2\xa1vcQ\xb6\xab\r\x94\xb99\xa2\xbf\x9fr\x8c\x17p\xacH\xe5\x92p\xe9q\x92\x8e\x13d\\x05\xe1TH\x86~\xe8LD\xa1\xe3\xb7\xed\xb4\x8d\xfb\xf6\xd3\xfcN\xa9\x14b\xb3g\x80\x07\x7f\xe3\xd2`\x1ds\x95\xc4}\xf0W\xc7\x96\x98\x97\xa1b\x9a\x89\xaarX\xecKP\xc0\xady \xfau\x88\xca\xb8T\xf5\xf8\x8e\x1f\x08\x7f\x8d\xab\xb6_\xf6\xe7\x17\t\x1bQ\x1b\r)Z@\x19+HTv\xd9\xa2\r\x13\xb4)\xf6\x8e\x8fB\x14F2\x1e\xc8m\xc9N{l\xd5\'\xc13\xc2e\xa7U\H(-\xab\xd8\xff6l\xbd\xb2\xf1\xf3\xd8)q\xfd\xb5\x1c\xb0\xed>B\xb8+$Tj\xe3OD\xa9\x0f\x0e\xda\xda\x8cZe.\xb5\x9e%\xbc\x9c\x0b\xf2\xe7=gz\xf1D\x05r\x88\xec\x87fd\x1fg\t (\xdf\x89\xc4\x82\xbb~#\xc3\xe6\xb0[\xb9\x82\x82n\x08\x10\xa3\x84\x00`\x00\x8dO\x93A\xb8%;\xde\x10'

我追加了一个 'e' keep still fail,所以我认为问题是零碎的

>>> bencoder.bdecode(b'd6:lengthi800927755e4:name12:Zet9 Geo.rar12:piece lengthi1048576e6:pieces4:1234e')

我明白了: {b'长度': 800927755, b'名称': b'Zet9 Geo.rar', b'片长': 1048576, b'片数': b'1234'}

def request_metadata(_socket,extHandShakeId,piece,timeout=20):
        msg = chr(20) + chr(extHandShakeId) + bencoder.bencode({"msg_type":0,"piece":piece}).decode()
        msgLen = pack(">I",len(msg))
        msg = msgLen+msg.encode()
        _socket.send(msg)
        #_socket.setblocking(0)
        total = b''
        start = time()
        data = _socket.recv(20*1024)
        return data

一块大小为16*1024byte,_socket.recv(20*1024)收不到整块?

这里的问题: data = _socket.recv(20*1024)

函数替换为:

def request_metadata(_socket,extHandShakeId,piece,timeout=20):
        msg = chr(20) + chr(extHandShakeId) + bencoder.bencode({"msg_type":0,"piece":piece}).decode()
        msgLen = pack(">I",len(msg))
        msg = msgLen+msg.encode()
        _socket.send(msg)
        total = b''
        while True:
            try:
                data = _socket.recv(20*1024)
                if data:
                    total = total + data
            except socket.timeout as e:
                print(str(e))
                break
        return total

结束我可以对该元数据进行解码 {b'长度': 800927755, b'名称': b'Zet9 Geo.rar', b'片长': 1048576, b'片数': b'3}\xdf\xd64\x90\x15z\x96aN .........