网络字节序:
大(高)端字节序(网络字节序):低位地址存放高位数据,高位地址存放低位数据
小(低)端字节序(主机字节序):低位地址存放低位数据,高位地址存放高位数据
在网络中需要考虑大小端的是IP和端口。
可以通过编写以下代码查看自己的电脑的字节序种类:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
union
{short s;char c[sizeof(short)];
}un2;
union
{int s;char c[sizeof(int)];
}un4;
int main()
{un2.s=0x0102;printf("[%d],[%d],[%d]\n",un2.c[0],un2.c[1],un2.s);un4.s=0x01020304;printf("[%d],[%d],[%d],[%d],[%d]\n",un4.c[0],un4.c[1],un4.c[2],un4.c[3],un4.s);return 0;
}
可以看出是低端字节序
网络传输用的是大端法,如果机器用的是小端法,则需要进行大小端的转换。
下面函数可以进行大小端转换:
#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);//主机字节序转换为网络字节序长整型uint16_t htons(uint16_t hostshort);//主机字节序转换为网络字节序短整型uint32_t ntohl(uint32_t netlong);//网络字节序转换为主机字节序长整型uint16_t ntohs(uint16_t netshort);//网络字节序转换为主机字节序daunting整型
IP地址转换函数:
p->表示点分十进制的字符串形式
to->到
n->表示network网络
int inet_pton(int af, const char *src, void *dst);
函数说明:将字符串形式的点分十进制IP转换为大端模式的网络IP(整形四字节)
- 参数:af:AF_INEF
- src:字符串形式的点分十进制的IP地址
- dst:存放转换网络IP变量的地址
例如:inet_pton(AF_INEF,"128.0.0.1",&addr);
十进制转十六进制:128->0x80 0->0x00 0->0x00 1->0x01
最后按大端字节序存放:0x01000080,这个就是四字节的整形
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
函数说明:网络IP转换为点分十进制的IP
- src:网络的整形的IP地址
- dst:转换后的IP地址,一般为字符串数组
- size:dst的长度,一般为16
- 返回值:成功返回指向dst的指针;
- 失败返回NULL,并设置error;
例如:IP地址:010aa8c0,转换为点分十进制:
01->1 0a->10 a8->168 c0->192;
由于网络的IP地址是高端模式,所以转换为192.168.10.1;