Unix Socket - 网络字节顺序

不幸的是,并不是所有的计算机都以相同的顺序存储包含多字节值的字节。考虑一个由2个字节组成的16位internet。有两种方法来存储这个值。

Little Endian − 在这种方案中,低阶字节存储在起始地址(A)上,高阶字节存储在下一个地址(A + 1)上。

Big Endian - 在这种方案中,高阶字节存储在起始地址(A)上,低阶字节存储在下一个地址(A + 1)上。

为了允许使用不同字节顺序约定的机器相互通信,Internet协议为在网络上传输的数据指定了规范的字节顺序约定。这就是所谓的网络字节顺序。

在建立Internet套接字连接时,必须确保sockaddr_in结构的sin_port和sin_addr成员中的数据是以网络字节顺序表示的。

Byte Ordering Functions

在主机的内部表示和网络字节顺序之间转换数据的例程如下

htons()  Host to Network Short

htonl()  Host to Network Long

ntohl()  Network to Host Long

ntohs()  Network to Host Short

下面列出了关于这些函数的更多细节

unsigned short htons(unsigned short hostshort) − 该函数将16位(2字节)数量从主机字节顺序转换为网络字节顺序。

unsigned long htonl(unsigned long hostlong) − 将32位(4字节)的数量从主机字节顺序转换为网络字节顺序。

unsigned short ntohs(unsigned short netshort) − 此函数将16位(2字节)数量从网络字节顺序转换为主机字节顺序。

unsigned long ntohl(unsigned long netlong) − 将32位的数量从网络字节顺序转换为主机字节顺序。

这些函数是宏,并导致将转换源代码插入到调用程序中。在little-endian计算机上,代码将根据网络字节顺序更改值。在big-endian机器上,不需要插入代码,因为不需要;这些函数被定义为null。

确定主机字节顺序的程序

将以下代码保存在byteorder.c文件中,然后编译它并在您的机器上运行它。

在本例中,我们将两个字节的值0x0102存储在短整数中,然后查看两个连续的字节c[0](地址A)和c[1](地址A + 1),以确定字节顺序。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容