大端字节序和小端字节序:
将低序字节存储在起始地址(即低地址),这称为小端字节序,将高序字节存储在起始地址,这称为大端字节序。
由于网络协议必须指定一个网络字节序,作为网络编程人员,必须清楚各种字节序间的区别。例如,在一个TCP分节中,有一个16位的端口号和一个32位的IPv4地址,发送协议栈和接收协议栈必须对此多字节字段的传送字节序进行协调,以达成一致。网际协议在处理这些多字节整数时,使用大端字节序。
从理论上说,具体实现可以把多字节整数按主机字节序存储在套接口地址结构中,当需要写到协议头部或从协议头部取出时,再转换到字节序格式或转换回来,这样可以避免我们牵涉细节。但是,由于历史上的原因和POSIX规范的规定,套接口地址结构中的某些成员按网络字节序进行维护。这样就必需考虑主机字节序和网络字节序间的相互转换。这两种字节序之间的转换使用下列四个函数:
#include<netinet/in.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
h代表host,n代表network,s代表16位值,l代表32位值。
当使用这些函数时,我们不关心主机字节序和网络字节序的真实值。我们所做的只是调用适当的函数来对给定值进行主机字节序与网络字节序间的转换。在那些与网际协议有相同字节序的系统中,这四个函数通常被定义为空宏。
浙公网安备 33010602011771号