k返回的是主机字节序5>函数实例:#include #include #include
#include #include #include int main()
{ char buffer[32];structin_addr in;in.s_addr =0;/*输入一个字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IPaddress:%s\n”,buffer);if((in.s_addr = inet_addr(buffer))==INADDR_NONE){ perror(“inet_addr”);exit(1);} else { printf(“after transfer:0x%0x\n”,in.s_addr);}总结:1.inet_addr和inet_network函数都是用于将字符串形式转换为整数形式用的;2.inet_addr返回的整数形式是网络字节序,而inet_network返回的整数形式是主机字节序。
3.inet_addr 和inet_network有一个小缺陷,那就是当IP是255.255.255.255时,这两个函数会认为这是个无效的IP地址,这是历史遗留
问题,其实在目前大部分的路由器上,这个 255.255.255.255的IP都是有效的。
4.inet_aton认为255.255.255.255是有效的,所以建议使用inet_aton.并且inet_aton函数返回的是网络字节序的IP地址。
二。进制IP地址转换为字符串形式的IP地址1.char * inet_ntoa(struct in_addr in);1>函数作用:将数值为in的网络字节序形式的二进制IP地址转换为字符串形式的IP地址。
2>形参:struct in_addr in:指向二进制的IP地址3>函数返回值:执行成功返回结果字符串的指针,参数无效返回NULL. 4>函数实例:#include #include #include
#include #include #include int main()
{ char buffer[32];char *str;structin_addr in;in.s_addr =0;/*输入一个字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IP地址:%s\n”,buffer);if( 0 == inet_aton(buffer,&;in)){ perror(“inet_aton”);exit(1);} else { printf(“the first transfer:0x%0x\n”,in.s_addr);} printf(“begin two process:\n”);if( (str =inet_ntoa(in) == NULL ){ printf(“inet_ntoa:argumentinvalid\n”);} else { printf(“thesecond transfer:%s\n”,str);}说明:1.函数inet_ntoa()的返回值为一个指向字符串的指针,
该内存函数inet_ntoa()每次调用都会重新覆盖,因此函数不安全,可能存在某种隐患2.实例:#include #include #include
#include #include #include int main()
{ structin_addr ip1,ip2;char *str1 ;char *str2;ip1.s_addr = 192<<24| 168 <<16 |1 <<8 | 1;ip2.s_addr =255<<24 | 255 <<16 |255<<8|255;str1 = inet_ntoa(ip1);str2 = inet_ntoa(ip2);printf(“ip1:0x%xà%s\n”,ip1.s_addr,str1);printf(“ip2:0x%xà%s\n”,ip2.s_addr,str2);}输出结果为:ip1: 0xc0a80101à255.255.255.255;ip2:0xffffffffà255.255.255.255;表明函数inet_ntoa在进行二进制IP地址到字符串IP地址的转换过程中是不可重入的,这个函数转换两个不同的IP地址得到了同一个结果。此类函数在调用之后,需要立即将结果取出,没有取出结果之前不能进行同样函数的调用。
三。最新的地址转换函数inet_pton()和inet_ntop()函数inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6.算是比较新的函数了。inet_pton函数原型如下[将“点分十进制” -> “整数”],并且这两个函数是一套安全的协议无关的地址转换函数。所谓安全即这两个函数是可重入的,并且这些函数支持多种地址类型,包括IPv4和IPv6. 1.inet_pton()函数1>函数功能inet_pton()函数将字符串类型的IP地址转换为二进制类型。
2>函数原型#include #include #include intinet_pton(int af, const char *src, void *dst);3>函数形参:? int af:af表示
网络类型的协议族,在IPv4下的值为AF_INET;? src:存