我正在尝试实现一个棘手的客户端,如果我成功地与一个对等者连接,但我不知道如何与这个对等者沟通,我就陷入了困境。
我成功地解码了急流元数据文件,成功地从那里获得了所有信息,我与TCP连接到了一个对等点,我发送了握手消息,我收到了来自对等方的握手消息,但在此之后,我没有收到来自对等方的任何消息(我期待有消息)。我试着向同行发送一条通畅的信息,然后我开始接收一些数据,但我不知道如何理解这些数据。
这是我到现在为止拥有的:
s.connect((ip, port))
print "Connected"
message = "%s%s%s%s%s" % (chr(19), "BitTorrent protocol", 8 * chr(0),
handshake_params["info_hash"],
handshake_params["peer_id"]
s.send(message)
handshake_data = s.recv(4096)
# unchoke
m = struct.pack(">IB", 1, 1)
s.send(m)
data = s.recv(4096)
print handshake_data
print struct.unpack("B" * len(data), data)这是输出:
BitTorrent protocolp p�I0a��9"x`��-UT3450-��kP+�BG ���������
(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 231, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 255, 251, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 127, 255, 221, 255, 255, 255, 255, 255, 191, 191, 255, 255, 127, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, 0, 0, 5, 4, 0, 0, 4, 191, 0, 0, 0, 5, 4, 0, 0, 1, 123, 0, 0, 0, 5, 4, 0, 0, 2, 122, 0, 0, 0, 5, 4, 0, 0, 2, 126, 0, 0, 0, 5, 4, 0, 0, 2, 177, 0, 0, 0, 5, 4, 0, 0, 2, 104, 0, 0, 0, 5, 4, 0, 0, 1, 37, 0, 0, 0, 5, 4, 0, 0, 0, 174, 0, 0, 0, 5, 4, 0, 0, 4, 157, 0, 0, 0, 5, 4, 0, 0, 0, 4, 0, 0, 0, 5, 4, 0, 0, 3, 172, 0, 0, 0, 5, 4, 0, 0, 2, 241, 0, 0, 0, 5, 4, 0, 0, 1, 90, 0, 0, 0, 5, 4, 0, 0, 3, 251, 0, 0, 0, 5, 4, 0, 0, 2, 200, 0, 0, 0, 5, 4, 0, 0, 0, 179, 0, 0, 0, 5, 4, 0, 0, 0, 180, 0, 0, 0, 5, 4, 0, 0, 3, 113, 0, 0, 0, 5, 4, 0, 0, 4, 181, 0, 0, 0, 5, 4, 0, 0, 1, 16, 0, 0, 0, 5, 4, 0, 0, 2, 169, 0, 0, 0, 5, 4, 0, 0, 4, 81, 0, 0, 0, 5, 4, 0, 0, 2, 57, 0, 0, 0, 5, 4, 0, 0, 1, 219)握手数据看起来没问题。我不明白的是,为什么我有那么多255个字节。我试图使用length_prefix、message_id和有效负载格式来解码消息,但是由于一开始我得到了255个字节,所以消息的长度很长,而且没有那么大的消息。
有什么噪音我应该试着过滤掉吗?如果你经常向右滚动,你会看到在某个时候字节开始变得很好,但我不知道该如何处理消息的开头。
发布于 2015-11-01 13:00:48
s.recv(4096)
您只是在读取某个未指定长度的数据块,大概是TCP缓冲区中的任何数据。
Bittorrent是基于消息的。TCP是一个字节流,这意味着它不能很好地将远程对等者发送的数据分割成消息,您必须自己去做。
https://stackoverflow.com/questions/33461878
复制相似问题