SOCKET 网络字节序与主机字节序及其相互转换

主机字节序:整数在内存中保存的顺序

 

两种方式:

Little endian 将低序字节存储在起始地址

Big endian    将高序字节存储在起始地址

 

网络字节序:整数在网络中的发送顺序

标准规定

Big endian   首先发送高位字节

字节序转换函数

htonl: 转换long类型到网络字节序

htons: 转换short类型到网络字节序

ntohl: 转换网络字节序到long类型

ntohs: 转换网络字节序到short类型

inet_addr: 将字符串格式IP转换到网络字节序

inet_ntoa: 将网络字节序格式IP转换到字符串

举例:SOCKADDR_IN中的数据格式

SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(5120);
addr.sin_family = AF_INET;

该结构体中的成员sin_addr, sin_port使用的是网络字节序

sin_addr:

inet_addr()返回的已经是网络字节序

127.0.0.1 --> 0x7F.00.00.01

-> 01 低位

    00

    00

    7F 高位

sin_port:

5120(0x1400)在内存中的布局是

    00 低位

    14 高位

经过htons处理后

    14 低位

    00 高位

个人理解:重要的是标准

其实这个转换要解决的问题是网络上各个主机中数据类型的兼容问题。

假设有两个主机A和B,A主机采用了LE字节序,B主机采用了BE字节序,

那么整数0x12345678在A主机中的表示是

    低位--------->高位

0x 78    56    34    12

如果不进行字节序变换A将这个数发给B主机时,B主机收到后在的数保存了内存布局,

将这个数解释为 0x78563412 就会出现错误

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值