关于网络字节顺序的问题
msdn中曰:
u_short ntohs(
u_short netshort
);
The ntohs function returns the value in host byte order. If the netshort parameter was already in host byte order, then no operation is performed.
纳闷:ntohs如何知道netshort是不是HBO?
顺便帮我看看我的理解对不对:
网络上传输本无高位字节低位字节优先的问题,网络发送时是按照内存中的顺序发送的。只是在在终端接收时,认为先接收到高位,再接收到低位。在接收端,如果不是接收链路层数据,根本不用去考虑网络字节顺序。可以认为从recv接收到缓冲区的字符就是发送端的字符,并按照先后到达顺序存放。如果用一个int行指针去访问缓冲区,那么读出来的数就与平台的存储字节顺序有关了。所以如果平台相同,应用层数据(就是不包括协议头)要么都进行转换,如发端htonl(),收端ntohl(),要么不进行转换,但如果一端转换,另一端不转换,在windows平台下是要出错的。但是协议头,我想还是要进行转换的,因为TCP/IP协议内核程序肯定是认为你按照台big-endian来发送的。所以不管是协议头还是应用层数据,如果是16位或者是32以上类型的数据,最好一概进行转换,虽然在发送时,都是从char*形缓冲区中按字节发送的。
再回到,ntohs如何知道netshort是不是HBO这个问题。好象又有点明白了。
如果netshort是从网络上来的原始数据,即不是其他地方定义的或是经过修改的网络数据。一概认为是按照网络字节存放big-endian,然后判断主机是什么字节顺序,如果也是big-endian,则不进行任何操作,如果是litter-endian,则进行转换。所以ntohs有没有实际进行转换完全依赖主机的字节顺序,msdn的表达不太确切。
有点罗嗦,如果我说的没错,一个上午的时间总算有点收获。不然,郁闷死了