Linux:网络编程——UDP编程的前期准备
字节序
字节序是一个处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。分为大端字节序和小端字节序,对应大端机器和小端机器。
大端字节序:即把数据的高字节放到低地址中
小段字节序:高字节放到高地址中
我们可以使用一串简单的代码来确定我们的机器是小端机器还是大端机器:
#include <iostream>
using namespace std;
int main()
{
union Data
{
int a;
char b;
}data;
data.a = 1;
if(data.b == 1)
{
cout<<"小端"<<endl;
}
else
{
cout<<"大端"<<endl;
}
return 0;
}
主机字节序:指的是机器本身的字节序,如果是大端,主机字节序就是大端,反之就是小端
网络字节序:规定网络当中传输的字节序使用大端,意味着如果是小段机器在传输的时候,需要将数据转化成大端字节序传输,对端机器默认传输过来的数据是大端字节序
前面我们了解到网络传输中数据的五元组就和寄快递一样,我们的收件人要知道寄件人的姓名和地址等信息才能告诉寄件人他是否收到了快递,计算机之间通过网络进行通信时就要知道IP地址等信息它才知道是谁给它发了信息,并作出回应,而源数据要通过网络进行传递就需要把它转化为网络字节序来进行传输。
综上我们得出结论:如果通信双方都是小段机器的时候,对于网络报头当中的IP和port还是必须遵循网络字节序的格式进行传输,否则网络链路上面的转发设备就无法正确转发该条数据,但因为双方都是小段机器,我们传输的数据可以不用进行字节序替换。
对于主机字节序和网络字节序之间的相互转换,我们用到下面的函数:
主机字节序转换为网络:
函数原型:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
返回值:
以网络字节序表示的32位整数
uint16_t htons(uint16_t hostshort);
返回值:
以网络字节序表示的16位整数
uint32_t ntohl(uint32_t netlong);
返回值:
以主机字节序表示的32位整数
uint16_t ntohs(uint16_t netshort);
返回值:
以主机字节序表示的16位整数
这4个函数记忆起来也不难,我们只要记住h表示“主机”,n表示网络,l表示32位“长”整数,s表示16位“短”整数。如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。