首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bittorrent协议TCP通信示例

Bittorrent协议TCP通信示例
EN

Stack Overflow用户
提问于 2015-11-01 11:56:22
回答 1查看 774关注 0票数 0

我正在尝试实现一个棘手的客户端,如果我成功地与一个对等者连接,但我不知道如何与这个对等者沟通,我就陷入了困境。

我成功地解码了急流元数据文件,成功地从那里获得了所有信息,我与TCP连接到了一个对等点,我发送了握手消息,我收到了来自对等方的握手消息,但在此之后,我没有收到来自对等方的任何消息(我期待有消息)。我试着向同行发送一条通畅的信息,然后我开始接收一些数据,但我不知道如何理解这些数据。

这是我到现在为止拥有的:

代码语言:javascript
复制
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)

这是输出:

代码语言:javascript
复制
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个字节,所以消息的长度很长,而且没有那么大的消息。

有什么噪音我应该试着过滤掉吗?如果你经常向右滚动,你会看到在某个时候字节开始变得很好,但我不知道该如何处理消息的开头。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-01 13:00:48

s.recv(4096)

您只是在读取某个未指定长度的数据块,大概是TCP缓冲区中的任何数据。

Bittorrent是基于消息的。TCP是一个字节流,这意味着它不能很好地将远程对等者发送的数据分割成消息,您必须自己去做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33461878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档