【问题标题】:Bittorrent bitfield lengthBittorrent 位域长度
【发布时间】:2015-03-05 17:55:23
【问题描述】:

我编写 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 network-programming bittorrent


    【解决方案1】:

    免责声明:我对 Python 网络 API 以及 recv() 的具体用途一无所知。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多