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

上传人:lis****211 文档编号:50076020 上传时间:2022-01-19 格式:DOC 页数:7 大小:71.50KB
收藏 版权申诉 举报 下载
ntohs,ntohl,htons,htonl的比较和详解_第1页
第1页 / 共7页
ntohs,ntohl,htons,htonl的比较和详解_第2页
第2页 / 共7页
ntohs,ntohl,htons,htonl的比较和详解_第3页
第3页 / 共7页
资源描述:

《ntohs,ntohl,htons,htonl的比较和详解》由会员分享,可在线阅读,更多相关《ntohs,ntohl,htons,htonl的比较和详解(7页珍藏版)》请在装配图网上搜索。

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

2、Short int" ntohs()--"Network to Host Short int"  32Bytes 16Bytes 16Bytes  之所 以需要这些函数是因为计算机数据表示存在两种字节顺序: NBO 与 HBO 。网络字节顺序 NBO( Network Byte Order ): 按从高到低的顺序存储,在网络上使用统一的网络字 节顺序,可以避免兼容性问题。主机字节顺序( HBO ,Host Byte Order ): 不同

3、的机器 HBO 不相同, 与 CPU 设计有关, 数据的 顺序是由 cpu 决定的 ,而与操作系统无关。 如 Intel x86 结构下 ,short 型数 0x1234 表示为 34 12, int 型数 0x12345678 表示为 78 56 34 12 。 如 IBM power PC 结构下 ,short 型数 0x1234 表示 为 1234, int 型数 0x12345678 表示为 12 34 56 78 。 由于这个原因不同体系结构的机器之间无法通信,所以要转 换成

4、一种约定的数序 ,也就是网络字节顺序 ,其实就是如同 power pc 那样的顺序 。在 PC 开发中有 ntohl 和 htonl 函数可以用来进行网络字节和主机字节的转换。 在  Linux  系统下:  htonl(),htons(), ntohl(), ntohs()  的头文件及 函数定义: #include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t ho

5、stshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); 在 windows 系统下: htonl(),htons(), ntohl(), ntohs(), inet_addr() 使用说明 ntohs() 简述: 将一个无符号 短整形数从网络字节顺序转换为主机字节顺序。 #include <winsock.h>  u_short PASCAL FAR ntohs( u_short netsho

6、rt);  netshort  :一个以网络字节顺序 表达的  16 位数。  注释:  本函数将一个  16 位数由网 络字节顺序转换为主机字节顺序。  返回值:  ntohs()  返回 一个以主机字节顺序表达的数。  ntohl()  简述:  将 一个无符号长整形数从网络字节顺序转换为主机字节顺序。 #include <winsock.h>  u_long PASCAL F

7、AR ntohl( u_long netlong);  netlong  :一个以网络字节顺序表 达的  32 位数。  注释:  本函数将一个  32 位数由网络 字节顺序转换为主机字节顺序。  返回值:  ntohl()  返 回一个以主机字节顺序表达的数。  htons()  简述: 将主机的无符号短整形数转换成网络字节顺序。 //将无符号 短整型主机字节序转换为网络字节序 #includ

8、e <winsock.h> u_short PASCAL FAR htons( u_short hostshort); hostshort :主机字节顺序表达的 16 位数。 注释: 本函数将一个 16 位数从主机字节顺序转换成网 络字节顺序。 返回值: htons() 返回一个网络字节顺 序的值。 简单地说 ,htons() 就是将一个数的高低位互换 (如 :12 34 --> 34 12) VB 表示 :MsgBox Hex(htons(&H1234)) 显示值为 3412htonl() 简述: 将主机的无符号长整

9、形数转换成网络字节顺序。 //将无符号长整型网络字节序转换为主机字节序 #include <winsock.h> u_long PASCAL FAR htonl( u_long hostlong); hostlong :主机字节顺序表达的 32 位数。 注释: 本函数将一个 32 位数从主机字节 顺序转换成网络字节顺序。 返回值: htonl() 返回一 个网络字节顺序的值。 inet_addr() 简述: 将一个点间隔地址转换成 一个 in_addr 。 #include <winsock.h> unsi

10、gned long PASCAL FAR inet_addr( const struct FAR* cp); cp :一个以 Internet 标准“ . ”间隔的字符串。例如 202.38.214.xx 当 IP 地址为 255.255.255.255 是被认 为无效 IP 地址。 本函数解释 cp 参数中的字符串, 这个字符串用 Internet 的“ . ”间隔格式表示一个数字的 Internet 地址。 返回值: 一个无符号长整形数,可 用作 Internet 地址。所有 Internet 地址以网络字节

11、顺序返回 (字节从左到右排列 )。inet_ntoa() 简述: 将网络地址 转换成“ . ”点隔的字符串格式。 #include <winsock.h> char FAR* PASCAL FAR inet_ntoa( struct in_addr in); in:一个表示 Internet 主机地址的结构。 注释:本函数 将一个用 in 参数所表示的 Internet 地址结构转换成以“ .间”隔的诸如“ a.b.c.d ”的字符串形式。请注意inet_ntoa() 返回的 字符串存放在 WINDOWS 套接口实现所分配

12、的内存中。应 用程序不应假设该内存是如何分配的。在同一个线程的下一 个  WINDOWS  套接口调用前,数据将保证是有效。当  IP  地 址为  255.255.255.255  是认为有效  IP  地址。这是与 inet_addr()  的区别  返回值:  若无错误发生, inet_ntoa() 返回一个字符指针。否则的话,返回 NULL 。其 中的数据应在下一个 WINDOWS 套接

13、口调用前复制出来。 inet_aton() 与 inet_ntoa() 作用相反。inet_pton() 简述: 本函数将点分十进制转换为整数 #include <sys/types.h>  #include <sys/socket.h> #include <arpa/inet.h>  int inet_pton(int af, const char *src, void *dst); 这个函数转换字符串到网络地址, 第一个参数 af 是地址族,转换后存在 dst

14、 中 inet_pton 是 inet_addr  的扩展,支持的多地址族有下列:  af = AF_INET  src  为指向字符型的地址,即  ASCII  的地址的 首地址( ddd.ddd.ddd.ddd  格式的),函数将该地址  转换 为  in_addr  的结构体,并复制在  *dst  中  af =AF_INET6 src 为指

15、向 IPV6 的地址,,函数将该地址转换为 in6_addr 的 结构体,并复制在 *dst 中 如果函数出错将返回一个负值, 并将  errno  设置为  EAFNOSUPPORT  ,如果参数  af  指定的 地址族和  src  格式不对,函数将返回  0。  #include <sys/types.h>  #include <sys/socket.h> #in

16、clude <arpa/inet.h>  const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);  这个函数转换 网络二进制结构到 ASCII 类型的地址, 参数的作用和上面相 同,只是多了一个参数 socklen_t cnt, 他是所 指向缓存区 dst 的大小,避免溢出,如果缓存区太小无法存储地址的值, 则返回一个空指针,并将 errno 置为 ENOSPCatoi()array to integer

17、 将字符串转换为整形数首先,假设你已经有了一个 sockaddr_in 结构体 ina ,你有一个 IP 地址 "132.241.5.10" 要储存在其中, 你就要用到函数 inet_addr(), 将 IP 地址从 点数格式转换成无符号长整型。 使用方法如下: ina.sin_addr.s_addr = inet_addr("132.241.5.10"); 注意,inet_addr() 返回的地址已经 是网络字节格式,所以你无需再调用 函数 htonl() 。我们现 在发现上面的代码片断不是十分完整的,因为它没有错误检

18、 查。 显而易见, 当 inet_addr() 发生错误时返回 -1。记住这些 二进制数字? (无符 号数 )-1 仅仅和 IP 地址 255.255.255.255 相符合!这可是广播地址!大错特 错!记 住要先进行错误检查。 好了,现在你可以将 IP 地址转换成长 整型了。有没有其相反的方法呢? 它可以将一个 in_addr 结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"  的含义是  "network to ascii")  ,就像这样:

19、 printf("%s",inet_ntoa(ina.sin_addr));  它将输出  IP  地址。需要 注意的是  inet_ntoa()  将结构体  in-addr  作为一  个参数, 不是 长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由 inet_ntoa() 控制的静态的固定的指针,所 以每次调用 inet_ntoa() ,它就将覆盖上次调用时所得的 IP 地址。例如: char *a1, *a2;a1 =

20、inet_ntoa(ina1.sin_addr); /* 这是 198.92.129.1 */a2 = inet_ntoa(ina2.sin_addr); /* 这是 132.241.5.10 */printf("address 1: %s ",a1);printf("address 2: %s ",a2); 输出如下: address 1: 132.241.5.10address 2: 132.241.5.10 假如你需要保存这个 IP 地址,使用 strcopy() 函数来指向你自己的字符指针。 **********************

21、******************************************** ***************************************************************** 测试代码如下 #include #include #include #include #include int main(int argc, char* argv[]){ struct in_addr addr1,addr2; ulong l1,l2; l1= inet_addr("192.168.0.74"

22、); l2 = inet_addr("211.100.21.179"); memcpy(&addr1, &l1, 4); memcpy(&addr2, &l2, 4); printf("%s : %s ", inet_ntoa(addr1), inet_ntoa(addr2)); // 注意这一句的运行结果 printf("%s ", inet_ntoa(addr1)); printf("%s ", inet_ntoa(addr2)); return 0;} 实际运行结果如下: 192.168.0.74 : 192.168.0.74 //从这里可以看出 ,printf 里的 inet_ntoa 只运行了一次。 192.168.0.74211.100.21.179inet_ntoa 返回一个 char *, 而 这个 char * 的空间是在 inet_ntoa 里面静态分配的,所以 inet_ntoa 后面的调用会覆盖上一次的调用。第一句 printf 的 结果只能说明在 printf 里面的可变参数的求值是从右到左的, 仅此而已。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!