网络字节序和主机字节序
来源:互联网 发布:高邮2016秋季网络培训 编辑:程序博客网 时间:2024/06/02 20:15
我们都知道,如今的通讯方式已经趋向与多样化,异构通信(计算机软件(操作系统) + 计算机硬件(内核架构,ARM,x86)不同)也已经很普遍了,如,手机和电脑中的qq进行通信,,,
同时,在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然后加入信息首部),当传到目的段时,被一步步解封,然后获取数据
从上面我们可以看出,数据在传输的过程中,一定有一个标准化的过程,也就是说:从主机a到主机b进行通信,
a的固有数据存储-------标准化--------转化成b的固有格式
如上而言:a或者b的固有数据存储格式就是自己的主机字节序,上面的标准化就是网络字节序(也就是大端字节序)
a的主机字节序----------网络字节序 ---------b的主机字节序
主机字节序:
就是自己的主机内部,由于CPU架构不同,内存中数据的处理方式,可以分为两种:
大端字节序(big-endian):按照内存的增长方向,高位数据存储于低位内存中
小端字节序(little-endian):按照内存的增长方向,高位数据存储于低位内存中
但是,如何知道我们的主机是那一种的呢???这个我们可以通过程序来进行验证:
- <span style="font-size:18px;">#include <stdio.h>
- #include <arpa/inet.h>
- int main(){
- unsigned long a = 0x12345678;
- unsigned char *p = (unsigned char *)(&a);
- printf("主机字节序:%0x %0x %0x %0x\n", p[0], p[1], p[2], p[3]);
- unsigned long b = htonl(a); //将主机字节序转化成了网络字节序
- p = (unsigned char *)(&b);
- printf("网络字节序:%0x %0x %0x %0x\n", p[0], p[1], p[2], p[3]);
- return 0;
- } </span>
可以看到我的当前主机是:小端字节序
关于:htonl
- <span style="font-size:18px;">#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);</span>
h是主机host,n是网络net,l是长整形long,s是短整形short,所以上面这些函数还是很好理解的
- <span style="font-size:18px;">#include <stdio.h>
- #include <arpa/inet.h>
- int main()
- {
- struct in_addr ipaddr;
- unsigned long addr = inet_addr("192.168.1.100");
- printf("addr = %u\n", ntohl(addr));
- ipaddr.s_addr = addr;
- printf("%s\n", inet_ntoa(ipaddr));
- return 0;
- } </span>
值得注意的是:
in_addr_in inet_addr(const char *strptr);
inet_addr的参数是一个:点分十进制字符串,返回的值为一个32位的二进制网络字节序的IPv4地址,不然的话就是:INADDR_NONE
而返回值为:in_addr_t:IPv4,一般为uint32_t
所以也可以定义为:unsigned long
char * inet_ntoa(struct in_addr inaddr);
参数是一个结构体,所以要调用必须先定义一个结构体。
转自:http://blog.csdn.net/msdnwolaile/article/details/50727653
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- shell基础-环境变量配置文件
- tarjan算法模板(强连通分量)
- 动态规划--开餐馆
- Python pass 语句
- vim打开文件时显示行号
- 网络字节序和主机字节序
- base64的算法详解
- lintcode把排序数组转换为高度最小的二叉搜索树
- JAVA 空间分配担保
- Docker学习之路
- 微信小程序 canvas绘制雷达图
- iOS攻防
- 第一次做树的题,并且用到了vector<pair<int,int> >,收获很大
- deepin下mysql的卸载和重装