我从其中一个答案中读到了文档:
ntohs函数采用TCP / IP网络字节顺序的16位数字(AF_INET或AF_INET6地址族),并以主机字节顺序返回一个16位数字。
请解释一个例子,如什么是网络字节顺序以及主机字节顺序是什么。
答案 0 :(得分:30)
数字1000是二进制,1111101000。
如果是16位二进制数,那就是0000001111101000。
如果将其分成两个8位字节,则为两个字节,值为00000011和11101000。
这两个字节可以有两个不同的顺序:
在字节可寻址机器中,硬件可以是“big-endian”或“little-endian”,具体取决于哪个字节存储在内存中较低的地址。大多数个人电脑都是小端的;大型计算机有big-endian和little-endian两种类型,大型计算机(例如IBM大型机和中型计算机以及SPARC服务器)都是大端计算机。
大多数网络都是位串行的,因此这些位是一个接一个地传输的。可以首先使用最高有效位或最低有效位来传输字节的位,但是网络硬件将从处理器隐藏这些细节。但是,它们将按照它们在主机内存中的顺序传输 bytes ,因此,如果一个小端机器正在向big-endian机器传输数据,那么little-endian的数量机器传输在接收大端机上会有所不同;这些差异不被网络硬件隐藏。
因此,为了允许big-endian和little-endian机器在每个协议层进行通信,要么:
各种Internet协议使用第一种策略,将big-endian指定为字节顺序;它在各种RFC中被称为“网络字节顺序”。 (Microsoft的SMB文件访问协议也使用第一种策略,但指定了little-endian。)
所以“网络字节顺序”是大端的。 “主机字节顺序”是您正在使用的机器的字节顺序;它可能是big-endian,在这种情况下ntohs()
只返回你给它的值,或者它可能是little-endian,在这种情况下ntohs()
交换你给它的值的两个字节和返回该值。例如,在大端机器上,ntohs(1000)
将返回1000,并且在小端机器上,ntohs(1000)
将交换高位和低位字节,给出1110100000000011二进制或小数为59395。