整数 在计算机内存中的 存储方式 有两种,一种是 大端模式,一种是 小端模式。这两种方式统称为 字节序。
不同的系统之间采用的字节序可能也是不同的。
对于 某个给定的系统,它采用的字节序被称为 主机字节序。
不同于具体系统,网络协议仅使用 大端模式 作为字节序(网络字节序)。
为此,在网络编程中,需要关注 主机字节序与网络字节序之间的转换。
在Linux中,这两种字节序的转换使用如下的四个函数:
extern uint32_t ntohl (uint32_t __netlong)
__THROW __attribute__ ((__const__));
extern uint16_t ntohs (uint16_t __netshort)
__THROW __attribute__ ((__const__));
extern uint32_t htonl (uint32_t __hostlong)
__THROW __attribute__ ((__const__));
extern uint16_t htons (uint16_t __hostshort)
__THROW __attribute__ ((__const__));
这四个函数在文件
netinet/in.h
中
__THROW 表示这个函数在 C++ 代码中支持抛出异常的操作。
不过,它在 C 中没有什么用处。
在这些函数中,h
代表host
,n
代表network
,s
代表short
,l
代表long
。uint16_t
为16位无符号整型数,uint32_t
为32位无符号整型数。
ntohl()
与ntohs()
可以分别被用于 IP地址 和 端口号。
这个位置 有一个应用的例子。