我正在用C ++编写一个bittorrent客户端,它接收来自包含几个6字节字符串的跟踪器(服务器)的消息。前4个字节表示对等体的IP地址,接下来的2个字节表示对等体正在侦听的端口号。
我已经研究了如何将ip字节转换为人类可读的ip地址,但我很难将表示端口号的两个字节转换为int(或类似的东西)
到目前为止,我的努力是:
BYTE portbinary[2];
unsigned short peerport;
//trackers[i]->peersBinary[j * 6 + 4] is the first byte
portbinary[0] = trackers[i]->peersBinary[j * 6 + 4];
//trackers[i]->peersBinary[j * 6 + 5] is the second byte
portbinary[1] = trackers[i]->peersBinary[j * 6 + 5];
peerport = *portbinary;
经过检查,peerport似乎只包含第一个字节的整数表示,我怎么能解决这个问题呢?
提前致谢:)
答案 0 :(得分:3)
我更喜欢使用按位运算而不是类型惩罚,因为它根本不会产生字节序问题(端口号是一个大端数,而今天许多系统都是小端)。
int peerport = (portbinary[0] << 8) | portbinary[1];
答案 1 :(得分:1)
由于数据似乎已对齐,您只需使用
即可peerport = ntohs(*(uint16_t *)(trackers[i]->peersBinary + j * 6 + 4));
答案 2 :(得分:1)
由于portbinary
是BYTE
的数组,因此*portbinary
相当于portbinary[0]
。
实现结果的便携式方法可能是:
peerport = portbinary[0];
peerport = 256*peerport + portbinary[1];
这假定portbinary
以网络字节顺序传递。
答案 3 :(得分:-1)
工会解决方案:
union port_extractor
{
BYTE raw_port[2];
unsigned short port_assembled;
};
如果您的计算机字节顺序与从网络中获取的表示形式相同,则此方法有效。对不起,我不知道它是如何通过bittorrent协议来的。
如果结尾是相反的,那么您必须使用的解决方案就不那么好了:
unsigned short port_assembled = (unsigned short)raw_port[first_byte] | ((unsigned short)raw_port[second_byte] << 8);
// first_byte = 0, second_byte = 1 or vice versa
// depending on source data endianess