inet_addr 布满荆棘的人生 2022-06-06 08:41 142阅读 0赞 210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式。英语叫做IPv4 numbers-and-dots notation。 如果把210.25.132.181转换为整数形式,是3524887733,这个就是整数形式的IP地址。英语叫做binary data。(其实binary是二进制的意思) 问题所在: 如何在字符串形式的IP和整数形式的IP之间转换呢? 问题解决思路: 有三个函数可以解决这个问题,当然不止这三个函数,只是这三个函数最常用且最易混淆。 隆重推出他们:inet\_network(), inet\_addr(), inet\_aton()!! 三者定义: int inet\_aton(const char \*cp, struct in\_addr \*inp); in\_addr\_t inet\_addr(const char \*cp); in\_addr\_t inet\_network(const char \*cp); 三者区别: 先说出区别吧,不卖关子。但其实这样不好,因为我怕你因为知道了结论而不去动手实践了。(你不会的,是吧? ^\_^) 纸上得来终觉浅,绝知此事要躬行。 inet\_addr和inet\_network函数都是用于将字符串形式转换为整数形式用的,两者区别很小,inet\_addr返回的整数形式是网络字节序,而inet\_network返回的整数形式是主机字节序。(你一定会纳闷,为什么函数叫inet\_network,却返回的是主机字节序,呵呵,就是这么奇怪,你又有什么办法呢…)其他地方两者并无二异。他俩都有一个小缺陷,那就是当IP是255.255.255.255时,这两个“小子”(对这两个函数的昵称,请谅解…^\_^)会认为这是个无效的IP地址,这是历史遗留问题,其实在目前大部分的路由器上,这个255.255.255.255的IP都是有效的。 inet\_aton函数和上面这俩小子的区别就是在于他认为255.255.255.255是有效的,他不会冤枉这个看似特殊的IP地址。所以我们建议你多多支持这个函数,那两个小子还是少用为好:)对了,inet\_aton函数返回的是网络字节序的IP地址。 1、inet\_addr()的功能是将一个点分十进制的IPv4转换成一个长整数型数(u\_long类型) 原文:The Windows Sockets inet\_addr function converts a string containing an (Ipv4) Internet Protocol dotted address into a proper address for the IN\_ADDR structure. 定义:unsigned long inet\_addr(const char FAR \*cp ); 例如:unsigned long IP = ntohl(inet\_addr(192.168.0.77)); 2、也可以这样使用:IN\_ADDR 定义如下: // // IPv4 Internet address // This is an 'on-wire' format structure. // typedef struct in_addr { union { struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { USHORT s_w1,s_w2; } S_un_w; ULONG S_addr; } S_un; #define s_addr S_un.S_addr /* can be used for most tcp & ip code */ #define s_host S_un.S_un_b.s_b2 // host on imp #define s_net S_un.S_un_b.s_b1 // network #define s_imp S_un.S_un_w.s_w2 // imp #define s_impno S_un.S_un_b.s_b4 // imp # #define s_lh S_un.S_un_b.s_b3 // logical host } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR; 3、相互转换 #include <Winsock2.h> #include <stdio.h> int main() { in_addr ipAddr; ipAddr.S_un.S_addr = inet_addr("127.0.0.1"); //将字符串形式的IP地址转换为按网络字节顺序的整形值 printf("\n%u", ipAddr.S_un); return 0; }
还没有评论,来说两句吧...