Bittorrent 位域长度

Bittorrent bitfield length

我编写 BitTorrent 客户端,现在我正在处理位域消息。 位域消息如下所示:

 <len=0001+X><id=5><bitfield>

问题是 len 总是相同的,而消息的实际长度总是不同的。这是我的 python 代码:

message = self.recv(4096)
print(len(message)) #prints different numbers every time
current_msg_len = struct.unpack('!I', message[:4])[0]
print(current_msg_len) #always prints the same number

我正在使用 TCP,我知道我可以获得不完整的消息,但是在握手和位域之后没有任何消息传入。 收到的消息示例:

[0, 0, 0, 95, 5, 255, 255, 255, 255, 254, 254, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 247, 253, 255]

免责声明:我对 python 网络 API 的一般情况和 recv() 的具体功能一无所知。

TCP 可以被认为是两个独立的、无限的字节流,它不像 UDP 那样被分成单独的消息。

您只是将网络层当前可用的任何内容读入缓冲区,这不太可能与 bittorrent 消息边界对齐。

最简单的方法是只读取 4 个字节,解码长度,然后将那么多字节读入一个单独的缓冲区,将其视为消息正文。 如果任何读取 returns 少于所需的字节数,您将不得不等待直到您可以完成 bittorrent-message。在这种情况下,您要么必须连接缓冲区,要么使用 API 让套接字读入预先分配的缓冲区,直到该缓冲区被填满。