手把手写C++服务器(20):网络字节序与主机字节序大端小端与共用体
Posted 沉迷单车的追风少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手写C++服务器(20):网络字节序与主机字节序大端小端与共用体相关的知识,希望对你有一定的参考价值。
前言:在正式开始学习socket编程之前,有必要了解网络字节序、主机字节序、大小端、如何判断大小端、在Linux当中如何转换主机字节序与网络字节序。为之后通用socket地址、专用socket地址、地址转换等知识点打下基础。
目录
什么是字节序?
CPU累加器一次能装载至少4个字节,即一个整数。每次装载的字节在内存中的排列顺序将影响它被累加器装载成整数的值。因此,字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
字节序分类:大端字节序、小端字节序
- 小端字节序(little endian):低字节数据存放在内存低地址
- 大端字节序(bigendian): 低字节数据存放在高地址处
网络字节序与主机字节序
- 主机字节序:现在计算机大多数采用小端字节序,因此小端字节序又被称为主机字节序。
- 网络字节序:网络传输、文件储存、人类读写习惯使用大端字节序,因此大端字节序又被称为网络字节序。
不同字节序之间传输问题
不同字节序在两台主机上传输势必造成解释不同导致错误。不仅是不同主机之间的数据传输,同一主机不同进程之间通信,也需要考虑字节序问题,如JAVA虚拟机采用大端字节序。
通常的做法是:发送端总是把要发送的数据转换成大端字节序后再发送,而接收方知道对方发送过来的是采用大端字节序,所以接收端会根据自身采用的字节序决定是否对接收到的数据进行转换。
Linux主机字节序-网络字节序转换API
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);// host to network long
unsigned short int htons(unsigned long int hostshort);// host ot network short
unsigned long int ntohl(unsigned long int netlong);// network to hostlong
unsigned short int ntohs(unsigned short int netshort);// network to hostshort
释义:如htonl,表示host to network long,将长型整型的主机字节序转换成网络字节序。
面试题:写一段程序判断大小端
union 型数据所占的空间等于其最大的成员所占的空间。对 union 型的成员的存取都是相对于该联合体基地址的偏移量为 0 处开始,也就是联合体的访问不论对哪个变量的存取都是从 union 的首地址位置开始。
联合是一个在同一个存储空间里存储不同类型数据的数据类型。这些存储区的地址都是一样的,联合里不同存储区的内存是重叠的,修改了任何一个其他的会受影响。
int checkCPU()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1); // 小端返回TRUE,大端返回FALSE
}
参考:
- 《Linux高性能服务器编程》
- 《Linux多线程服务端编程》
- 《C++并发编程实战》
- 《计算机网络——自顶向下方法》
- 《TCP/IP详解——卷2:实现》
- 《计算机操作系统》西安电子科技大学出版社
- 《鸟哥的Linux私房菜》
- 《Linux指令范例速查手册》
- 《深度探索C++面向对象模型》
- 《Effective C++ 改善程序与设计的55个具体做法》
- 《编程珠玑》
- 《后台开发核心技术与应用实践》
- 《Essential C++》
- 《More Effective C++》
- 《编译原理》
以上是关于手把手写C++服务器(20):网络字节序与主机字节序大端小端与共用体的主要内容,如果未能解决你的问题,请参考以下文章