Linux raw socket - endianness in ip header
我想确认,应该使用ntohs / ntohl等将ip头中大于一个字节(短,int ..或它们的替代int16_t ...)的任何值转换为big endian,以通过导线发送。铅>
当使用普通套接字或使用其他技术时,内核是否在幕后管理了?
这很混乱,因为某些函数(例如,使用ioctl获取接口的ip地址)在转换为sockaddr_in *时似乎已经以大端序的方式放置了数据。它输出我的地址,例如36.2.168.192(带有printf \\的%d),但是ifreq输出它的地址,例如192.168.2.36
代码
1 2 | 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地址
而使用
1 2 3 |
将以正确的顺序(192.168.2.36)给我一些零的IP地址,后跟零。
哇...我迷路了。
如果你问我,那真是个丛林。
问题
将什么转换为大端字节,什么不转换为?
最好不要将其视为大端或小端,而是主机顺序(可以是任意顺序)和网络顺序(大端)。您是正确的,在IP标准中,每个字段都是按网络顺序排列的。您应使用
通常以网络顺序在内部存储IP地址,在这种情况下,可以使用