我编写 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 个字节,解码长度,然后将这么多字节读入单独的缓冲区,将其视为消息正文。 如果任何读取返回的字节数少于所需的字节数,您将不得不等待,直到可以完成比特流消息。在这种情况下,您要么必须连接缓冲区,要么使用 API 让套接字读入预先分配的缓冲区,直到该缓冲区被填满。
关于python - BitTorrent 位域长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28884502/