如何从跟踪器响应中获取对等方的 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 和端口的主要内容,如果未能解决你的问题,请参考以下文章