Bittorrent Imlementation — расшифровывает «peers» значение в ответе трекера

Я пытаюсь декодировать значение «peers» в ответе трекера, используя c ++.

Согласно протоколу bittorrent:

peers: (бинарная модель) Вместо использования описанной модели словаря
выше значение пиров может быть строкой, состоящей из кратных 6
байт. Первые 4 байта являются IP-адресом, а последние 2 байта являются портом
число. Все в сетевой (big endian) нотации.

Я пытался до сих пор этот код:

void DecodePeers(OrderedMap<std::string, int> &map, const char * buffer)
{
int counter = 0;

char * peerIp = new char[5];
char * portNum = new char[3];

while (*(buffer + counter) != NULL)
{

for (int i = counter; i < counter + 4; i++)
{
*(peerIp + i - counter) = *(buffer + i);
}

counter += 4;

*(peerIp + 4) = '\0';

for (int i = counter; i < counter + 2; i++)
{
*(portNum + i - counter) = *(buffer + i);
}

counter += 2;

*(portNum + 2) = '\0';

std::string str(peerIp);
int port = atoi(portNum);
map.Insert(str, port);
}
}

Моя проблема в том, что этот код дает мне номер порта: 7643488, который явно не может быть номером порта. У кого-то есть идея, что я сделал не так?

0

Решение

atoi (PortNum);

Это для преобразования ascii / человекочитаемых строк, представляющих числа 10 оснований, в целочисленные типы. Другими словами, вы могли только поставить строку "00" в "99" в 2 байта. Номера портов: 0-65535, то есть uint16, который вписывается в 2 байта без какой-либо кодировки.

Все, что вам нужно сделать, это учесть порядок байтов.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]