1.字节序转换
CPU 向内存保存数据以及解析数据的方式有两种:
1)大端字节序(Big Endian): 高位字节存放在低位地址上
2) 小端字节序(Little Endian): 高位字节存放在高位地址上
因为这种差异性,异导致数据解析的混乱,因此在通过网络传输数据时,先将数据数组转换成大端格式再进行网络传输(网络序)。
相应的转化函数如下:
unsigned short htons(unsigned short); //把short型数据从主机字节序转换成网络字节序
unsigned short ntohs(unsigned short); //把short型数据从网络字节序转换成主机字节序
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);
这里s指short(2个字节),以s结尾的函数通常作为端口的转换;l 指long(4个字节), 以l结尾的函数通常作为IP地址的转换。
2.网络地址的初始化和分配
1)将字符串信息转换成网络字节序整数型
#include<arpa/inet.h>
in_addr_t inet_addr(const char *string); //成功时返回32位大端整型值,失败时返回INADDR_NONE
int inet_aton(char *string,struct in_addr *addr); //成功时返回1,失败时返回0
string: 含有需转换的IP地址信息的字符串地址值
addr:将保存转换结果的in_addr结构体变量的地址值
2)将网络字节序整型IP地址转换成字符串型
#include<arpa/inet.h>
char *inet_ntoa(struct in_addr adr); //成功时返回转换后的字符串地址值,失败后返回0
3.IP地址与域名之间的转换
#include<netdb.h>
struct hostent *gethostbyname(const char *hostname); //成功时返回hostent结构体的地址,失败时返回NULL
struct hostent *gethostbyaddr(const char *addr,socklen_t len,int family); //成功时返回hostent结构体变量值,失败时返回NULL
addr:含有IP地址信息的in_addr 结构体指针
len:向第一个参数传递的地址信息字节数
family:传递地址簇信息,IPV4时为AF_INET
hostent结构体如下:
struct hostent{
char *h_name; //offical name(官方域名,代表某一主页)
char **h_aliases; //alias list (同一IP绑定多个域名)
int h_addrtype; //host address type
int h_length; //address length
char **h_addr_list ; //address list (多个IP对应同一域名,实现多个服务器直接的负载均衡)
}