在IP报头中的字节顺序
我想确认一个大于一个字节(短,int ..或其替代int16_t ..)的IP头中的任何值应该使用ntohs / ntohl等转换为大端。
当正常的插座被使用或者使用了其他技术时,内核是否能够在引擎盖下进行管理?
这是相当混乱的,因为一些函数,如获取与ioctl的接口的IP地址似乎已经把数据放在sockaddr_in *的时候,以大端的方式。 它输出我的地址,如36.2.168.192(printf的%d),但ifreq的输出像192.168.2.36
码
int addr = ((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr.s_addr;
printf("%d %d %d %d ", (addr >> 24) & 255 , (addr >> 16) & 255,(addr >> 8) & 255, (addr) & 255);
以相反的顺序给我我的IP地址
而使用
for (int _x = 0; x < 14; ++_x) {
printf("%d ", ifr.ifr_ifru.ifru_addr.sa_data[_x] );
}
会给我一些零地址的正确顺序(192.168.2.36),然后是零。 哇......我迷路了。
如果你问我,那就是一片丛林。
题
什么转换为大端,什么不是?
最好不要认为它是大端或小端,而是主机顺序(可能是)或网络顺序(这是大端)。 在IP标准中,每个字段都是网络顺序是正确的。 您应该使用ntohs
和ntohl
函数将网络转换为主机命令,以及将主机转换为网络命令的htons
和htonl
函数。 这样你的代码就可以在一个大型机器上编译。
IP地址通常以网络顺序内部存储,在这种情况下,可以使用inet_pton
和inet_ntop
将其转换为演示文稿格式。 因此,您通常不需要使用这些地址的存储格式,除非您手动应用网络掩码等。如果您正在这样做,八位字节(您和我的字节)将以自然顺序(即111.222)存储。 33.44以111,222,33和44的顺序存储。如果你仔细想想,那是一个大端顺序。