C++,协议通讯noths(),htons()是否要一一对应,还是都用htons()就好

时间:2021-05-11 11:40:13
C++,通过协议通讯时,需要将相应网络字序和本地字序进行装换,如先用htons()转成网络字序,然后接收方用noths()接收转成本地字序,可是我今天看别人写的一个工程,他用的noths(),然后传输,服务器也用noths()解析,得出的结果还是正确的,请牛人指点。传送时不是应该先转成网络字序吗?而且难道不需要对应?谢谢!
有人说
这两个函数的工作内容完全相同,都是把字节顺序倒一下,或者都是保持原样不变,所以可以随意替换使用。定义成两个为的是“见名知意”。 
不知道这种说法是否对,如果对的话,那怎么实现的不同CPU区别?谢谢!

3 个解决方案

#1


关注下
我记得网络字节序是固定的
个人猜测你那个工程的方法不具有一般性通用性

#2


ntohs = network to host short,即将short类型从网络字节序转换成本机字节序(相应的有一个针对long类型的ntohl),htons相反。

网络字节序是固定的,采用大端方式表示,但是各自的主机字节序就要看CPU了,一般INTEL的CPU采用小端方式表示,即低字节在低地址,但现在据说INTEL的CPU可配置成支持大端方式,没细究过。

关于大端小端的含义你网上查一下。

你说的这个工程之所以没问题,是一种巧合,比如客户和服务器都是大端方式,那么实际上这两个函数就是什么也不做的。

#3


首先,之所以我们需要htons和noths,是因为机器大小端序的问题
典型的Intel 80x86 CPU使用的是little endian,而苹果Macintosh和大多数非80x86的系统使用的是big endian。
由于目前市面上little endian机器占主流,所以你看到的这个工程由于概率问题没有出问题。
但是,毫无疑问,这个做法是错误的。
LZ 的“先用htons()转成网络字序,然后接收方用noths()接收转成本地字序”理解是正确的。
不要被这个工程误导

#1


关注下
我记得网络字节序是固定的
个人猜测你那个工程的方法不具有一般性通用性

#2


ntohs = network to host short,即将short类型从网络字节序转换成本机字节序(相应的有一个针对long类型的ntohl),htons相反。

网络字节序是固定的,采用大端方式表示,但是各自的主机字节序就要看CPU了,一般INTEL的CPU采用小端方式表示,即低字节在低地址,但现在据说INTEL的CPU可配置成支持大端方式,没细究过。

关于大端小端的含义你网上查一下。

你说的这个工程之所以没问题,是一种巧合,比如客户和服务器都是大端方式,那么实际上这两个函数就是什么也不做的。

#3


首先,之所以我们需要htons和noths,是因为机器大小端序的问题
典型的Intel 80x86 CPU使用的是little endian,而苹果Macintosh和大多数非80x86的系统使用的是big endian。
由于目前市面上little endian机器占主流,所以你看到的这个工程由于概率问题没有出问题。
但是,毫无疑问,这个做法是错误的。
LZ 的“先用htons()转成网络字序,然后接收方用noths()接收转成本地字序”理解是正确的。
不要被这个工程误导