大端存储与小端存储

大端存储与小端存储

本文主要以linux下网络编程实验对大端存储与小端存储进行简单讲解:

  • 概念
    大端存储与小端存储模式主要指的是数据在计算机中存储的两种字节优先顺序。小端存储指从内存的低地址开始,先存储数据的低序字节再存高序字节;相反,大端存储指从内存的低地址开始,先存储数据的高序字节再存储数据的低序字节。

    例如:
    十进制数9877,如果用小端存储表示则为:
    高地址 <- - - - - - - - 低地址
    10010101[高序字节] 00100110[低序字节]
    用大端存储表示则为:
    高地址 <- - - - - - - - 低地址
    00100110[低序字节] 10010101[高序字节]

    各自优点:
    小端存储:便于数据之间的类型转换,例如:long类型转换为int类型时,高地址部分的数据可以直接截掉。
    大端存储:便于数据类型的符号判断,因为最低地址位数据即为符号位,可以直接判断数据的正负号。

    用途:
    小端存储:常见于本地主机上(也有部分类型主机为大端存储)。
    大端存储:常见于网络通信上,网际协议TCP/IP在传输整型数据时一般使用大端存储模式表示,例如TCP/IP中表示端口和IP时,均采用的是大端存储。

注:Linux中套接字ip地址的表示结构sockaddr_in.in_addr.in_addr_t类型实质上一般采用32位的unsigned int实现。


实验

  Ubuntu中,建立客户端与服务器端程序之间的TCP链接,并绑定服务器端的端口为9877,注意此处直接将本地主机中用小端存储表示的9877整型数值复制给TCP的地址。
服务器端部分程序:

#define PORT 9877
int s_fd,c_fd;// 服务器和客户套接字标识符

struct sockaddr_in s_addr;  // 服务器套接字地址
s_fd = socket(AF_INET, SOCK_STREAM, 0);// 创建套接字

s_addr.sin_family = AF_INET;    // 定义服务器套接字地址中的域
s_addr.sin_addr.s_addr=htonl(INADDR_ANY);// 定义套接字地址
s_addr.sin_port = PORT;//直接将小端存储表示的9877赋值给地址中的端口

客户端部分程序:

#define PORT 9877
struct sockaddr_in addr;// 服务器段套接字地址
int sockfd;// 客户套接字标识符

sockfd = socket(AF_INET,SOCK_STREAM, 0);// 创建套接字
addr.sin_family = AF_INET;          // 客户端套接字地址中的域
addr.sin_addr.s_addr=htonl(INADDR_ANY);// 定义套接字地址
addr.sin_port = PORT;//直接将小端存储表示的9877赋值给地址中的端口
len = sizeof(addr);
newsockfd = connect(sockfd,(struct sockaddr *)&addr,len);//发送连接服务器的请求

  在上面的客户端与服务器端的TCP链接程序中,均是直接将将小端存储表示的9877赋值给地址中的端口。在将该客户端程序和服务端程序运行成功后,我们在Linux的终端中输入netstat -a查看网络链接情况,结果图如下:

这里写图片描述

  由图可知,服务器端的监听端口和与客户端建立TCP链接的实际端口是38182,并不是9877。
  其实,这就是由于主机字节序和网络字节序不一致导致的,因为9877在主机上由小端存储表示的,所以其二进制位10010101 10010101,TCP协议在解析该整型时则会按照大端存储模式来解析,解析结果为10010101 10010101,即38182。

进行字节序的转换
   在将端口号9877赋值给网络地址的端口前,先利用htons将主机字节序转换为网络字节序。客户端和服务器端的代码修改为:

//服务器端程序修改部分
s_addr.sin_port = htons(PORT);//进行主机字节序到网络字节序的转换

//客户端程序修改部分
addr.sin_port = htons(PORT);

  修改完成后,重新编译运行程序,建立客户端与服务器端之间的TCP链接。再次用netstat -a查看网络链接情况,结果图如下:

这里写图片描述

  由图可知,本次实验结果中,服务器端的端口正常为9877。

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值