在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标准中,每个字段都是网络顺序是正确的。 您应该使用ntohsntohl函数将网络转换为主机命令,以及将主机转换为网络命令的htonshtonl函数。 这样你的代码就可以在一个大型机器上编译。

IP地址通常以网络顺序内部存储,在这种情况下,可以使用inet_ptoninet_ntop将其转换为演示文稿格式。 因此,您通常不需要使用这些地址的存储格式,除非您手动应用网络掩码等。如果您正在这样做,八位字节(您和我的字节)将以自然顺序(即111.222)存储。 33.44以111,222,33和44的顺序存储。如果你仔细想想,那是一个大端顺序。

链接地址: http://www.djcxy.com/p/61907.html

上一篇: endianness in ip header

下一篇: multiple variables over udp socket