我写了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]
答案 0 :(得分:2)
免责声明:我对一般的python网络API以及recv()
具体做什么一无所知。
TCP可以被认为是两个独立的,无限的字节流,它不像UDP那样被分成单独的消息。
您只是将网络层当前可用的任何内容读入缓冲区,这不太可能与bittorrent消息边界对齐。
最简单的方法是只读取4个字节,解码长度,然后将多个字节读入单独的缓冲区,将其视为消息体。 如果任何读取返回的数量少于所需的字节数,则必须等到可以完成bittorrent消息。在这种情况下,你要么必须连接缓冲区,要么使用一个API,让套接字读入预先分配的缓冲区,直到缓冲区被填满。