怎样做网站的链接,golang建设网站,徐州企业网站建设公司,国外对企业网站开发的研究在C/C写网络程序的时候#xff0c;往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs()#xff0c;htons()这4个函数。 网络字节顺序与本地字节顺序之间的转换函数#xff1a; htonl()--Host to Network Long ntohl()--N…在C/C写网络程序的时候往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs()htons()这4个函数。 网络字节顺序与本地字节顺序之间的转换函数 htonl()--Host to Network Long ntohl()--Network to Host Long htons()--Host to Network Short ntohs()--Network to Host Short 之所以需要这些函数是因为计算机数据表示存在两种字节顺序NBO与HBO 网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储在网络上使用统一的网络字节顺序可以避免兼容性问题。 主机字节顺序(HBOHost Byte Order): 不同的机器HBO不相同与CPU设计有关数据的顺序是由cpu决定的,而与操作系统无关。 如 Intel x86结构下, short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12 如 IBM power PC结构下, short型数0x1234表示为12 34, int型数0x12345678表示为12 34 56 78 由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序,其实就是如同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 hostshort); 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 netshort); netshort一个以网络字节顺序表达的16位数。 注释 本函数将一个16位数由网络字节顺序转换为主机字节顺序。 返回值ntohs()返回一个以主机字节顺序表达的数。 ntohl() 简述 将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
include winsock.h u_long PASCAL FAR ntohl( u_long netlong); netlong一个以网络字节顺序表达的32位数。 注释 本函数将一个32位数由网络字节顺序转换为主机字节顺序。
返回值 ntohl()返回一个以主机字节顺序表达的数。 htons() 简述 将主机的无符号短整形数转换成网络字节顺序。
//将无符号短整型主机字节序转换为网络字节序 #include winsock.h u_short PASCAL FAR htons( u_short hostshort); hostshort主机字节顺序表达的16位数。 注释 本函数将一个16位数从主机字节顺序转换成网络字节顺序。 返回值 htons()返回一个网络字节顺序的值。 简单地说,htons()就是将一个数的高低位互换 (如: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()返回一个网络字节顺序的值。 inet_addr() 简述 将一个点间隔地址转换成一个in_addr。 #include winsock.h unsigned 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地址以网络字节顺序返回(字节从左到右排列)。 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套接口实现所分配的内存中。应用程序不应假设该内存是如何分配的。在同一个线程的下一个WINDOWS套接口调用前数据将保证是有效。 当IP地址为255.255.255.255是认为有效IP地址。这是与inet_addr()的区别 返回值 若无错误发生inet_ntoa()返回一个字符指针。否则的话返回NULL。其中的数据应在下一个WINDOWS套接口调用前复制出来。 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中 inet_pton 是inet_addr的扩展支持的多地址族有下列 af AF_INET src为指向字符型的地址即ASCII的地址的首地址ddd.ddd.ddd.ddd格式的函数将该地址 转换为in_addr的结构体并复制在*dst中 af AF_INET6 src为指向IPV6的地址函数将该地址转换为in6_addr的结构体并复制在*dst中 如果函数出错将返回一个负值并将errno设置为EAFNOSUPPORT如果参数af指定的地址族和src格式不对函数将返回0。 #include sys/types.h
#include sys/socket.h
#include arpa/inet.h const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); 这个函数转换网络二进制结构到ASCII类型的地址参数的作用和上面相同只是多了一个参数socklen_t cnt,他是所 指向缓存区dst的大小避免溢出如果缓存区太小无法存储地址的值则返回一个空指针并将errno置为ENOSPC atoi() array to integer将字符串转换为整形数 首先假设你已经有了一个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()。 我们现在发现上面的代码片断不是十分完整的因为它没有错误检查。 显而易见当inet_addr()发生错误时返回-1。记住这些二进制数字(无符 号数)-1仅仅和IP地址255.255.255.255相符合这可是广播地址大错特 错记住要先进行错误检查。 好了现在你可以将IP地址转换成长整型了。有没有其相反的方法呢 它可以将一个in_addr结构体输出成点数格式 这样的话你就要用到函数 inet_ntoa()(ntoa的含义是network to ascii)就像这样 printf(%s,inet_ntoa(ina.sin_addr)); 它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一 个参数不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由inet_ntoa()控制的静态的固定的指针所以每次调用 inet_ntoa()它就将覆盖上次调用时所得的IP地址。例如 char *a1, *a2; a1 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.10 address 2: 132.241.5.10 假如你需要保存这个IP地址使用strcopy()函数来指向你自己的字符指针。