python - BitTorrent 位域长度

标签 python network-programming bittorrent

我编写 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/

相关文章:

python - 使用Python将ini文件中的所有内容读入字典

python - 此 WSGI 应用程序无法访问守护进程 :/mod. wsgi

python - 如何检查矩形是否超出 pygame 屏幕

python - 如何访问特定号码的ipv4地址?

android - startUsingNetworkFeature 和 requestRouteToHost Depreciated 在 6.0 替代这个

c++ - 用 C++ 连接到 UDP 跟踪器

bittorrent - 如果 torrent 包含多个文件,如何知道每个文件对应的是哪一段?

c++ - ICMP 校验和错误

C++套接字,客户端无法向java服务器发送消息

p2p - 现有 DHT 的 Hello World