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



《ntohs,ntohl,htons,htonl的比较和详解》由会员分享,可在线阅读,更多相关《ntohs,ntohl,htons,htonl的比较和详解(9页珍藏版)》请在装配图网上搜索。
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"32Bytes htons()--"Host to Network Short int"16Byt
2、es ntohs()--"Network to Host Short int"16Bytes 之所以需要这些函数是因为计算机数据表示存在两种字节顺序: NBO与 HBO 网络字节顺序 NBO( Network Byte Order): 按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼 容性问题。 主机字节顺序( HBO, Host Byte Order): 不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而 与操作系统无关。 如Intelx86结构下,short型数0x1234表示为34 12, int型数0x表示为7
3、8 5634 12。 如 旧Mpower PC结构下,short型数0x1234表示为1234, int型数0x表示为 12 34 56 78。 由于这个原因不同体系结构的机器之间无法通信 ,所以要转换成一种约定的 数序,也就是网络字节顺序,其实就是如同powerpc那样的顺序。在PC开发中有 ntohl 和 htonl 函数可以用来进行网络字节和主机字节的转换。 在 Linux 系统下: htonl(),htons(), ntohl(), ntohs() 的头文件及函数定义: uint32_t htonl(uint32_t hostlong); uint16_t hton
4、s(uint16_t hostshort); 在 windows 系统下: ntohs() 简述: 将一个无符号短整形数从网络字节顺序转换为主机字节顺序。 #include <winsock.h> 一个以网络字节顺序表达的 16 位数。 注释: 本函数将一个 16 位数由网络字节顺序转换为主机字节顺序。 返回值: ntohs()返回一个以主机字节顺序表达的数。 ntohl() 简述: 将一个无符号长整形数从网络字节顺序转换为主机字节顺序。 include <winsock.h> 一个以网络字节顺序表达的 32 位数。 注释: 本函数将一
5、个 32 位数由网络字节顺序转换为主机字节顺序。 返回值: ntohl()返回一个以主机字节顺序表达的数。 htons() 简述: 将主机的无符号短整形数转换成网络字节顺序。 // 将无符号短整型主机字节 序转换为网络字节序 #include <winsock.h> u_short PASCAL FAR htons( u_short hostshort); hostshort: 主机字节顺序表达的 16位数。 注释: 本函数将一个 16 位数从主机字节顺序转换成网络字节顺序。 返回值: htons()返回一个网络字节顺序的值。 简单地说,htons()
6、就是将一个数的高低位互换 (如:12 34 --> 34 12) VB 表示 : MsgBox Hex(htons(&H1234)) 显示值为 3412 htonl() 简述: 将主机的无符号长整形数转换成网络字节顺序。 // 将无符号长整型网络字节 序转换为主机字节序 #include <winsock.h> u_long PASCAL FAR htonl( u_long hostlong); hostlong: 主机字节顺序表达的 32位数。 注释: 本函数将一个 32 位数从主机字节顺序转换成网络字节顺序。 返回值: htonl()
7、返回一个网络字节顺序的值。 简述: 将一个点间隔地址转换成一个 in_addr。 #include <winsock.h> cp: 202.38. 214.xx 当IP地址为 255.255. 255.255是被认为无效IP地址。 返回值: 简述: 将网络地址转换成 “.点隔的字符串格式。” #include <winsock.h> in: 注释: 当IP地址为 255.255. 简述: 本函数将点分十进制转换为整数 #include <sys/types.h> #include <sys/socket.h&g
8、t; af = AF_INET src为指向字符型的地址,即 ASCII的地址的首地址(ddd.ddd.ddd.ddd格式 的),函数将该地址 转换为 in_addr 的结构体,并复制在 *dst 中 af =AF_INET6 src为指向IPV6的地址,,函数将该地址转换为in6_addr的结构体,并复 制在 *dst 中如果函数出错将返回一个负值,并将 errno 设置为 EAFNOSUPPOR, T 如果参数af指定的地址族和src格式不对,函数将返回0。 #include <sys/types.h> #include <sys/socket.h>
9、 指向缓存区 dst 的大小,避免溢出,如果缓存区太小无法存储地址的值, 则返回一个空指针,并将 errno 置为 ENOSPC atoi() array to integer 将字符串转换为整形数 首先,假设你已经有了一个 sockaddr_in结构体ina,你有一个IP地址" 132.241. 使用方法如下: 132.241. 5.10"); 255.255. 255.255 相符合!这可是广播地址!大错特错!记住要先进行错误检查。 例如: char *a1, *a2; 1.sin_addr); /*这是 198.92. 129.1 */
10、 2.sin_addr); /*这是 132.241. 5.10 */ printf("address 1: %s ",a1); printf("address 2: %s ",a2); 输出如下: address 1: 132.241. 5.10 address 2: 132.241. 5.10 假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符指 针。 ***************************************************************** *********
11、********************************************************* 测试代码如下 #include #include #include #include #include int main(int argc, char* argv[]){struct in_addr addr1,addr2; ulongl1,l2; 192.168. 0.74"); 211.100. 21.179"); memcpy(&addr1, &l1, 4); memcpy(&addr2, &l2, 4); printf("%s : return 0;} 实际运行结果如下: 192.168. 0.74 : 192.168. 192.168. 0.74 211.100. 21.179 inet_ntoa返回一个char*,而这个char*的空间是在inet_ntoa里面静态分配 的,所以 inet_ntoa 后面的调用会覆盖上一次的调用。新濠天地娱乐场 66bb.org 第一句 printf 的结果只能说明在 printf 里面的可变参数的求值是从右到左的,仅 此而已。 9/ 9
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。