一、字节顺序和转换函数
1、大小端
不同机器内部对变量的字节存储顺序不同,有的采用大端模式,有的采用小端模式
大端模式:高字节数据存放在低字节处,低字节数据存放在高字节处
小端模式:低字节数据存放在低字节处,高字节数据存放在高字节处
2、网络字节顺序
在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此TCP/IP协议规定了在网络上必须采用网络字节顺序(也就是大端模式)。
数据在发送到网络之前将其转换成大端模式,在接受到数据之后再将其转换成符合接收端主机的存储模式。
3、大小端转换函数
#include<netinet.h>
uint32_t htonl(uint32_t, hostlong);
unit16_t htons(uint16_t, hostshort);
uint32_t ntohl(uint32_t, netlong);
uint16_t ntohs(uint16_t, netshort);
htonl:host to network long,用于将主机unsigned int 型数据转换成网络字节顺序
htons:host to network short,用于将主机unsigned short 型数据转换成网络字节顺序
ntohl、ntohs的功能分别与htonl、htons相反。
二、inet 系列函数
通常我们习惯使用字符串形式的网络地址,但在网络上进行数据通信时需使用二进制形式且为网络字节顺序的IP地址。Linux为网络地址的格式转换提供了一系列函数。
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
char* inet_ntoa(struct in_addr in);
struct in_addr inet_makeaddr(int net, int host);
in_addr_t inet_lnao