htons

在Windows和Linux网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序,以Windows下的代码为例:


1

2

#include<winsock2.h>

u_shorthtons(u_shorthostshort);

htons的功能:将一个无符号短整型的主机数值转换为网络字节顺序,即大尾顺序(big-endian)

参数u_short hostshort:16位无符号整数

返回值:TCP/IP网络字节顺序.

不同的CPU有不同的字节顺序类型,这些字节顺序类型指的是整数在内存中保存的顺序,即主机字节顺序。常见的有两种:


序号

英文名

中文名

描述

1

big-endian

大尾顺序

地址的低位存储值的高位

2

little-endian

小尾顺序

地址的低位存储值的低位

htons 是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为:高位字节存放在内存的低地址处。

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用big-endian排序方式。

示例编辑

例1

而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在内存的低字节处。举个例子吧。假定你的数据是0x1234,

在网络字节顺序里 这个数据放到内存中就应该显示成

addr addr+1

0x12 0x34

而在x86电脑上,数据0x1234放到内存中实际是:

addr addr+1

0x34 0x12

htons 的用处就是把实际主机内存中的整数存放方式调整成网络字节顺序

例2

我们在Intel机器下,执行以下程序


1

2

3

4

5

6

7

8

9

10

11

12

13

voidmain()

{

inta=16,b;

b=htons(a);

cout<<"a="<<a<<endl;

cout<<"b="<<b<<endl;

1

}

运行的结果如下图

解释一下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。

Tips编辑

不同CPU上运行不同的操作系统,其主机字节顺序也是不同,参见下表:


处理器

操作系统

字节顺序

Alpha

全部

little-endian

HP-PA

NT

little-endian

HP-PA

UNIX

big-endian

Intelx86

全部

little-endian

MIPS

NT

little-endian

MIPS

UNIX

big-endian

PowerPC

NT

little-endian

PowerPC

非NT

big-endian
时间: 2024-10-25 12:45:00

htons的相关文章

接口处理篇 accept bind connect atan2 htons inet_addr inet_aton inet_ntoa listen ntohl recv send sendto socket

accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #include<sys/types.h> #include<sys/socket.h> 定义函数 int accept(int s,struct sockaddr * addr,int * addrlen); 函数说明 accept()用来接受参数s的socket连线.参数s的socket必需先经bind().listen()函数处理过,当有连线进来时 accept()

【转】htonl(),htons(),ntohl(),ntons()--大小端模式转换函数

转自 http://www.cnblogs.com/kungfupanda/archive/2013/04/24/3040785.html 不同机器内部对变量的字节存储顺序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian).大端模式是指高字节数据存放在低地址处,低字节数据放在高地址处.小端模式是指低字节数据存放在低地址处,高字节数据放在高地址处. 在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP

ntohs, ntohl, htons,htonl的比较和详解

ntohs =net to host short int 16位htons=host to net short int 16位ntohl =net to host long int 32位htonl=host to net long int 32位 网络字节顺序NBO(Network Byte Order) 按从高到低的顺序存储,在网络上使用同一的网络字节顺序,可避免兼容性问题: 主机字节顺序HBO(Host Byte Order) 不同的机器HBO不相同,与CPU的设计有关,数据的顺序是由CP

htons()和htonl()函数

htons() #include <arpa/inet.h> uint16_t htons(uint16_t hostshort); htons的功能:                        将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian) 参数u_short hostshort: 16位无符号整数 返回值:               TCP / IP网络字节顺序.htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就

htons和htonl引发的惨案

什么都不说,先抛出问题: 客户端:connect: Connection refused 调试服务器出现以下问题: port:传入的服务器端口号,设置为8888 srvaddr.sin_port:将本地端口号转化为网络端口号后存放在网络套接口地址数据结构中 这里竟然是0! 此处使用的是htonl 这就是死在htons手下的客户端,将客户端与服务器分割在银河的两端 原因:没有注意网络套接口地址数据结构中sin_port的数据类型,以及误以为htonl可以随意替代htons使用 IPV4通用网络套接

socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转换函数: htonl()--"Host to Network Long" ntohl()--"Network to Host Long" htons()--"Host to Network Short" ntohs()--"Network

ntohs, ntohl, htons,htonl inet_aton等详解(转)

ntohs =net to host short int 16位 htons=host to net short int 16位 ntohs =net to host long int 32位 htonl=host to net long int 32位 简述: 将一个无符号短整形数从网络字节顺序转换为主机字节顺序. #include u_short PASCAL FAR ntohs( u_short netshort); netshort:一个以网络字节顺序表达的16位数. 注释: 本函数将一

转:为什么需要htons(), ntohl(), ntohs(),htons() 函数

为什么需要htons(), ntohl(), ntohs(),htons() 函数: 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转换函数: htonl()--"Host to Network Long"      ntohl()--"Network to Host Long"      htons()--&quo

详解C语言的htons函数

在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 int main(){   printf("%d /n",htons(16)); return 0;} 得到的结果是4096,初一看感觉很怪. 解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000. 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010.因此在发送