- Unix 套接字教程
- Unix Socket - 主页
- Unix 套接字 - 什么是套接字?
- Unix 套接字 - 网络地址
- Unix Socket - 网络主机名
- Unix Socket - 客户端服务器模型
- Unix Socket - 结构
- Unix Socket - 端口和服务
- Unix Socket - 网络字节顺序
- Unix Socket - IP 地址函数
- Unix Socket - 核心功能
- Unix Socket - 辅助函数
- Unix Socket - 服务器示例
- Unix Socket - 客户端示例
- Unix Socket - 总结
- Unix 套接字有用资源
- Unix 套接字 - 快速指南
- Unix Socket - 有用资源
- Unix Socket - 讨论
Unix Socket - 网络字节顺序
不幸的是,并非所有计算机都以相同的顺序存储组成多字节值的字节。考虑一个由 2 个字节组成的 16 位互联网。有两种方法可以存储该值。
Little Endian - 在此方案中,低位字节存储在起始地址 (A) 上,高位字节存储在下一个地址 (A + 1) 上。
Big Endian - 在此方案中,高位字节存储在起始地址 (A) 上,低位字节存储在下一个地址 (A + 1) 上。
为了允许具有不同字节顺序约定的机器相互通信,互联网协议为通过网络传输的数据指定了规范的字节顺序约定。这称为网络字节顺序。
建立 Internet 套接字连接时,必须确保 sockaddr_in 结构的 sin_port 和 sin_addr 成员中的数据以网络字节顺序表示。
字节排序函数
在主机的内部表示和网络字节顺序之间转换数据的例程如下:
功能 | 描述 |
---|---|
顿斯() | 主机到网络短路 |
htonl() | 主机到网络长 |
恩托尔() | 网络主机长 |
ntohs() | 网络到主机短路 |
下面列出了有关这些功能的更多详细信息 -
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 位数量从网络字节顺序转换为主机字节顺序。
这些函数是宏,导致将转换源代码插入到调用程序中。在小端机器上,代码会将值更改为网络字节顺序。在大端机器上,不会插入任何代码,因为不需要任何代码;函数被定义为空。
确定主机字节顺序的程序
将以下代码保存在文件byteorder.c中,然后编译它并在您的计算机上运行它。
在此示例中,我们将两字节值 0x0102 存储在短整型中,然后查看两个连续字节 c[0](地址 A)和 c[1](地址 A + 1)来确定该字节命令。
#include <stdio.h> int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; }un; un.s = 0x0102; if (sizeof(short) == 2) { if (un.c[0] == 1 && un.c[1] == 2) printf("big-endian\n"); else if (un.c[0] == 2 && un.c[1] == 1) printf("little-endian\n"); else printf("unknown\n"); } else { printf("sizeof(short) = %d\n", sizeof(short)); } exit(0); }
该程序在奔腾机器上生成的输出如下 -
$> gcc byteorder.c $> ./a.out little-endian $>