Как получить IP-адреса и порты сверстников из ответа трекера - PullRequest
0 голосов
/ 12 мая 2018

Я пишу простой torrent-клиент на Qt, и я не понимаю, как получить IP-адреса и порты одноранговых узлов из ответа трекера. Я получаю ответ успешно, но именно значение ключа peers выглядит нечитаемым:

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

Почему это выглядит так и как сделать эти данные читаемыми?

В спецификации BitTorrent говорится, что значение peers всегда отправляется в Big-Endian. Я не знаю, может ли это быть причиной нечитаемости, но я подозреваю, что.

1 Ответ

0 голосов
/ 12 мая 2018

Как сказал Энкомб в комментариях, это 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.ХХ.208: 37840

или если вы используете qFromBigEndian i. е.

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

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

...