特点
①各主机的字节序可能不同,网络协议指定的通讯字节序为大端。
②只有在多字节数据处理时才需要考虑字节序。
③运行在同一台计算机的进程互相通信时,不需要考虑字节序。
二、字节序转换函数
头文件:#include <arpa/inet.h>
①htonl函数(发送数据方使用)
32位:(IPv4字节序的转换)
uint32_t htonl(uint32_t host32bitvalue);
功能:将32位主机字节序数据转换成网络字节序数据。
返回值:返回网络字节序的值。
②ntohl函数(接收数据方使用)
uint32_t ntohl(uint32_t net32bitvalue); //返回主机字节序的值
功能:将32位网络字节序转换成主机字节序数据。
返回值:返回主机字节序的值。
16位(端口的转换)
③htons函数(发送方使用)
uint16_t htons(uint16_t host16bitvalue); //返回网络字节序的值
功能:将16位主机字节序数据转换成网络字节序数据。
返回值:返回网络字节序的值。
④ntohs函数(接收方使用)
uint16_t ntohs(uint16_t net16bitvalue); //返回主机字节序的值
功能:将16位网络字节序转换成主机字节序数据。
返回值:返回主机字节序的值。
总结:四个函数,如果主机和网络字节序相同,那么函数不会颠倒数据
二、新型网路地址转化函数
这两个函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。
① 将点分十进制的ip地址转化为用于网络传输的数值格式
int inet_pton(int family, const char *strptr, void *addrptr);
参数:family 协议族
strptr 点分十进制数串
addrptr 32位无符号整数的地址
返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
eg:
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
//点分十进制数串
char *str_ip="172.20.10.1";
//32位无字符串整型数据
unsigned int num_ip=0;
//AF_INET:IPv4 AF_INET6:IPv6
inet_pton(AF_INET,str_ip,&num_ip);
printf("转换前:str_ip=%s\n",str_ip);
printf("转换后:num_ip=%u\n",num_ip);
return 0;
}
②将数值格式转化为点分十进制的ip地址格式
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
返回值:若成功则为指向结构的指针,若出错则为NULL
eg:
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
//模拟一个32位网络字节序IP地址
unsigned char p[]={192.168.0.1};
char ip_str[16]="";
inet_ntop(AF_INET,p,ip_str,16);
printf("ip_str:%s\n",ip_str);
return 0;
}