为什么通过网络发送的数据转换为网络字节顺序?

Sub*_*esh 3 c sockets ipc

我不确定如何使用hton().理论上,通过网络发送的任何数据都应采用网络字节(即大端)格式.假设客户端A支持big-endian而B支持little-endian.我正在从A发送数据到B,数据被读取为多字节.然后在网络中我们需要使用htonl()和将数据转换为网络字节顺序htons().由于客户端A已经是big-endian,htonl()htons()返回相同的输出.但是B是小端的,所以这些功能颠倒了顺序.鉴于此,我们怎么能说当大端和小端机器需要通信时,坚持使用通用格式(即大端)是解决问题的方法?

glg*_*lgl 7

我将以另一种方式尝试,显示整个流程:

0x44332211通过电线发送总是发生的44 33 22 11.发送方htonl()确保通过恢复字节的顺序(在LE机器上)或者只保留它们的方式(在BE机器上).接收器转动44 33 22 110x44332211ntohl()-再次,无论是通过恢复他们或离开他们.

所提到的功能{hton,ntoh}{l,s}()以便携的方式帮助编程:无论程序是在LE还是BE机器上进行调整,它们始终按照应有的方式工作.因此,即使在BE机器上,也应该调用函数,即使它们是noops.

例:

A(BE)想要发送0x44332211给B(LE).

  1. A 0x44332211在内存中有一个数字44 33 22 11.
  2. htonl()作为程序的调用已被编写为可移植的.
  3. 该号码仍然表示为44 33 22 11并通过电汇发送.
  4. B接收44 33 22 11并通过它ntohl().
  5. B获取11 22 33 44from 表示的值ntohl()并将其放入相应的变量中 - 然后0x44332211按照需要生成.

只是计划-再次,需要随时调用这些函数从思考你是编程哪种机器为节省您的所有各种机器和在需要时调用这些功能.

可以在不知道A或B是BE还是LE的情况下表达相同的示例:

  1. A有0x44332211内存中的数字.
  2. 拨打电话,htonl()以便通过电话发送号码44 33 22 11.是通过还原还是通过离开来完成,取决于主机B的字节顺序.
  3. B接收44 33 22 11并通过它ntohl().这个是否反转,取决于主机B的字节顺序.
  4. B获得所需的价值0x44332211.