当我通过我的 torrent 客户端向对等点发送请求时,为什么我收到的片段大小小于 9 字节长?

问题描述 投票:0回答:1

我发送给同行的请求如下:

b'\x00\x00\x00\r\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'

我得到的回应是:

b'\x00\x00\x00\x00\x00\x00\x00\x00R'

非官方 BitTorrent 规范指定片段消息应遵循以下内容:

件:

块消息是可变长度的,其中X是块的长度。有效负载包含以下信息:

index:指定从零开始的片段索引的整数 begin:指定片段内从零开始的字节偏移量的整数 block:数据块,是索引指定的块的子集。

我正在处理这样的消息:

elif message_id == 7: if len(payload) >= 9: piece_index, begin = struct.unpack('!II', payload[:8]) block = payload[8:] if piece_index not in self.received_pieces: self.received_pieces[piece_index] = {} self.received_pieces[piece_index][begin] = block
请告诉我您是否需要更多信息

我尝试过对消息的处理方式进行挑剔,但我完全没有收到数据,所以我真的无能为力。

byte bittorrent torrent
1个回答
0
投票
正如评论者指出的那样,TCP 是字节流。因此,您必须不断从套接字读取数据,直到可以解码完整的消息。当前读取缓冲区中的内容不能保证是完整的消息、确切的一条消息或类似的消息。它只是一个字节流,你必须进行分段。

Bittorrent 流也不是同步 RPC 机制,因此您不能保证您收到的下一个消息是对上一条消息的回复。相反,您必须跟踪您请求的内容,同时对方可能会发送其他内容,并且仅在稍后回复几条消息。

© www.soinside.com 2019 - 2024. All rights reserved.