如何从跟踪器响应中获取对等方的 IP 和端口

Posted

技术标签:

【中文标题】如何从跟踪器响应中获取对等方的 IP 和端口【英文标题】:How to get peers' IPs and ports from tracker response 【发布时间】:2018-05-12 14:25:42 【问题描述】:

我在 Qt 中编写了简单的 torrent 客户端,但我不明白。我成功得到响应,但键 peers 的确切值看起来不可读:

d8:completei1976e10:incompletei54e8:intervali1800e5:peers6:TQ+ГХ§e

为什么会这样以及如何使这些数据可读?

在 BitTorrent 规范中,peers 的值总是以 Big-Endian 发送。我不知道这是否可能是不可读的原因,但我怀疑。

【问题讨论】:

见:***.com/questions/50094674/…T Q + Г Х § => 84 81 43 xx yy 167 (yy*256+167=??) => 84.81.43.xx:(yy*256+167) How to parse Ip and port from http tracker response的可能重复 我看到了那个问题,但我仍然无法理解如何解码我得到的信息。请解释一下好吗? 问题不在于解码这个响应,而在于理解如何获得它的可读表示:TQ+ГХ§。这不是你跟我说的。 TQ+ГХ§ 是 6 字节原始二进制数据的字符表示,4 字节 IPv4 + 2 字节 PORT 在 bigendian 中。您需要读取 4 个字节并将它们转换为 IP,然后读取 2 个字节并将它们转换为 PORT。 【参考方案1】:

就像 Encombe 在 cmets 中所说的那样,它是 BigEndian。您可以通过这种方式以编程方式进行:

QByteArray peerTmp = "TQ+ГХ§e";
QHostAddress host;
uchar *data = (uchar *)peerTmp.constData();
uint ipAddress = 0;
uint port = (int(data[4]) << 8) + data[5]; 
ipAddress += uint(data[0]) << 24;
ipAddress += uint(data[1]) << 16;
ipAddress += uint(data[2]) << 8;
ipAddress += uint(data[3]);
host.setAddress(ipAddress);
qDebug() << "IP" << host.toString() << ":" << port;

IP 84.81.XX.208:37840

或者如果你使用qFromBigEndian i。 e.

QHostAddress peerIPAddress(qFromBigEndian<qint32>("TQ+Г"));
qDebug() << "IP" << peerIPAddress.toString();

见:http://doc.qt.io/qt-5/qtnetwork-torrent-trackerclient-cpp.html

【讨论】:

以上是关于如何从跟踪器响应中获取对等方的 IP 和端口的主要内容,如果未能解决你的问题,请参考以下文章

跟踪特定的 IP 和端口

如何在 Bittorrent 跟踪器中完成对等点的识别

Bittorrent 在多个对等点之间维护状态

如何使apache2上的服务响应多个端口上的请求

如何连接到从 bittorrent 获得的对等点

从上游读取响应头时,Nginx uwsgi(104:由对等方重置连接)