Bittorrent Imlementation - 解码跟踪器响应中的“对等”值

时间:2015-10-16 22:18:03

标签: c++ protocols network-protocols bittorrent

我正在尝试使用c ++解码跟踪器响应中的“peers”值。

根据bittorrent协议:

  peer :(二进制模型)而不是使用描述的字典模型   在上面,对等体值可以是由6的倍数组成的字符串   字节。前4个字节是IP地址,后2个字节是端口   数。全部采用网络(大端)表示法。

到目前为止,我一直在尝试这段代码:

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,显然不能是端口号。有人知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

的atoi(端口编号);

用于将表示基数为10的ascii /人类可读字符串转换为整数类型的字符串。换句话说,您只能将字符串"00"放入"99" 2个字节。端口号为0-65535,这是一个uint16,按原样适合2个字节而不进行任何编码。

您需要做的就是考虑字节顺序。