- Unix套接字教程
- Unix套接字 - 首页
- Unix套接字 - 什么是套接字?
- Unix套接字 - 网络地址
- Unix套接字 - 网络主机名
- Unix套接字 - 客户端服务器模型
- Unix套接字 - 结构体
- Unix套接字 - 端口和服务
- Unix套接字 - 网络字节序
- Unix套接字 - IP地址函数
- Unix套接字 - 核心函数
- Unix套接字 - 辅助函数
- Unix套接字 - 服务器示例
- Unix套接字 - 客户端示例
- Unix套接字 - 总结
- Unix套接字有用资源
- Unix套接字 - 快速指南
- Unix套接字 - 有用资源
- Unix套接字 - 讨论
Unix套接字 - 网络字节序
不幸的是,并非所有计算机都以相同的顺序存储构成多字节值的字节。考虑一个由2个字节组成的16位整数。有两种方法可以存储此值。
小端序 - 在此方案中,低位字节存储在起始地址 (A) 上,高位字节存储在下一个地址 (A + 1) 上。
大端序 - 在此方案中,高位字节存储在起始地址 (A) 上,低位字节存储在下一个地址 (A + 1) 上。
为了允许具有不同字节顺序约定的机器相互通信,互联网协议指定了通过网络传输数据的规范字节顺序约定。这称为网络字节序。
在建立互联网套接字连接时,必须确保sockaddr_in结构中的sin_port和sin_addr成员中的数据以网络字节序表示。
字节排序函数
在主机内部表示和网络字节序之间转换数据的例程如下:
| 函数 | 描述 |
|---|---|
| htons() | 主机到网络短整型 |
| htonl() | 主机到网络长整型 |
| ntohl() | 网络到主机长整型 |
| 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 $>