网络字节序

字节序的概念和示例

CPU向内存保存数据的方式有2种,所以CPU解析数据的方式也分为2种。CPU保存和解析数据的方式叫字节序,分为小端字节序和大端字节序。

大端字节序:高位字节存放到低位地址。
小端字节序:高位字节存放到高位地址。

下边以0x1234560x表示 这是16进制数,并不是数字中的一部分)为示例用画图的方式说明上边两种定义。
大端字节序(比较符合人类的思维习惯):
网络字节序_第1张图片

小端字节序:
网络字节序_第2张图片

使用网络协议发送数据的两端必须使用同一种字节序,比如要么都使用大端字节序或者都使用小端字节序,否则的话,就像两个不同语言的人进行沟通,造成鸡同鸭讲的尴尬局面。

字节序转换

字节序转换函数有:

unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);

函数名中字母解释:
n代表的就是network(网络)
h代表的是host(本机)
s表示的是short(16 位整数)
l表示的是long(32 位整数)

htonshtons等字母的组合,意思是把把本机字节序转换成网络字节序的无符号16位整数
ntohlntohl等字母的组合,意思是把把网络字节序转换成本机字节序的无符号32位整数

下边提供一个代码段示例endian_exchange.c:

#include
#include
int main(int argc,char **argv[])
{
    unsigned short hostPort = 0x2345;
    unsigned short networkPort;
    unsigned long hostAddress = 0x23456789;
    unsigned long networkAddress;

    networkPort=htons(hostPort);
    networkAddress=htonl(hostAddress);
    printf("Host order port:%#x \n",hostPort);
    printf("Network order port:%#x \n",networkPort);
    printf("Host order address:%#lx \n",hostAddress);
    printf("Network order address:%#lx \n",networkAddress);
    return 0;
}

gcc endian_exchange.c -o endian_exchange进行编译,./endian_exchange执行。
网络字节序_第3张图片

此文章为11月Day 30学习笔记,内容来源于极客时间《网络编程实战》。

你可能感兴趣的:(网络编程实战,网络)