有人说
这两个函数的工作内容完全相同,都是把字节顺序倒一下,或者都是保持原样不变,所以可以随意替换使用。定义成两个为的是“见名知意”。
不知道这种说法是否对,如果对的话,那怎么实现的不同CPU区别?谢谢!
3 个解决方案
#1
关注下
我记得网络字节序是固定的
个人猜测你那个工程的方法不具有一般性通用性
我记得网络字节序是固定的
个人猜测你那个工程的方法不具有一般性通用性
#2
ntohs = network to host short,即将short类型从网络字节序转换成本机字节序(相应的有一个针对long类型的ntohl),htons相反。
网络字节序是固定的,采用大端方式表示,但是各自的主机字节序就要看CPU了,一般INTEL的CPU采用小端方式表示,即低字节在低地址,但现在据说INTEL的CPU可配置成支持大端方式,没细究过。
关于大端小端的含义你网上查一下。
你说的这个工程之所以没问题,是一种巧合,比如客户和服务器都是大端方式,那么实际上这两个函数就是什么也不做的。
网络字节序是固定的,采用大端方式表示,但是各自的主机字节序就要看CPU了,一般INTEL的CPU采用小端方式表示,即低字节在低地址,但现在据说INTEL的CPU可配置成支持大端方式,没细究过。
关于大端小端的含义你网上查一下。
你说的这个工程之所以没问题,是一种巧合,比如客户和服务器都是大端方式,那么实际上这两个函数就是什么也不做的。
#3
首先,之所以我们需要htons和noths,是因为机器大小端序的问题
典型的Intel 80x86 CPU使用的是little endian,而苹果Macintosh和大多数非80x86的系统使用的是big endian。
由于目前市面上little endian机器占主流,所以你看到的这个工程由于概率问题没有出问题。
但是,毫无疑问,这个做法是错误的。
LZ 的“先用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可配置成支持大端方式,没细究过。
关于大端小端的含义你网上查一下。
你说的这个工程之所以没问题,是一种巧合,比如客户和服务器都是大端方式,那么实际上这两个函数就是什么也不做的。
网络字节序是固定的,采用大端方式表示,但是各自的主机字节序就要看CPU了,一般INTEL的CPU采用小端方式表示,即低字节在低地址,但现在据说INTEL的CPU可配置成支持大端方式,没细究过。
关于大端小端的含义你网上查一下。
你说的这个工程之所以没问题,是一种巧合,比如客户和服务器都是大端方式,那么实际上这两个函数就是什么也不做的。
#3
首先,之所以我们需要htons和noths,是因为机器大小端序的问题
典型的Intel 80x86 CPU使用的是little endian,而苹果Macintosh和大多数非80x86的系统使用的是big endian。
由于目前市面上little endian机器占主流,所以你看到的这个工程由于概率问题没有出问题。
但是,毫无疑问,这个做法是错误的。
LZ 的“先用htons()转成网络字序,然后接收方用noths()接收转成本地字序”理解是正确的。
不要被这个工程误导
典型的Intel 80x86 CPU使用的是little endian,而苹果Macintosh和大多数非80x86的系统使用的是big endian。
由于目前市面上little endian机器占主流,所以你看到的这个工程由于概率问题没有出问题。
但是,毫无疑问,这个做法是错误的。
LZ 的“先用htons()转成网络字序,然后接收方用noths()接收转成本地字序”理解是正确的。
不要被这个工程误导