字节序,地址转换
字节序:是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺
序。两种格式:大端和小端。
小端:高地址存放高位数,低地址存放低位数
大端:高地址存放低位数,低地址存放高位数
验证主机的字节序
#include<stdio.h>
int main()
{
int m = 0x1234;
char*p = (char *)&m;
printf(“%0x\n”,*p);
return 0;
}
输出结果为12时 为大端
输出结果为34时 为小端
算术运算与内存操作运算:算术运算是不改变被运算数据的字节序
IP地址的字节序:IP地址的整数值,自IP地址生成的时刻起,就一定是网络字节序的(大端)
字节序转换函数:OS一般都提供htons、htonl、ntohs、ntohl这四个字节序操作函数
#include<netinet/in.h>
主机字节序转换成网络字节序函数:
u_longhtonl(u_long hostlongvalue); 32位
u_shorthtons(u_short hostshortvalue); 16位
网络字节序转换成主机字节序函数:
u_longntohl(u_long netlongvalue); 32位
u_shorthotns(u_short netshortvalue); 16位
地址转换函数
#include<arpa/inet.h>
将点分十进制数串转换成32位无符号整数
intinet_pton(int family, const char *strptr, void *addrptr);
family:协议族(AF_INET、AF_INET6、PF_PACKET等),常用AF_INET
strptr:点分十进制数串
addrptr:32位无符号整数的地址
成功返回1,失败返回其他
将32位无符号整数转换成点分十进制数串
constchar *inet_ntop( int family, const void *addrptr, char*strptr, size_t len );
family:协议族(AF_INET、AF_INET6、PF_PACKET等),常用AF_INET
addrptr:32位无符号整数
strptr:点分十进制数串
len:strptr缓存区长度
len的宏定义
#defineINET_ADDRSTRLEN 16 // for ipv4#defineINET6_ADDRSTRLEN 46 // for ipv6成功返回首地址,否则为NULL