- 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);
其中,typedef uint32_t in_addr_t
区别:
inet_addr和inet_network函数都是用于将字符串形式转换为整数形式用的,两者区别很小,inet_addr返回的整数形式是网络字节序,而inet_network返回的整数形式是主机字节序。
上面两个函数都有个bug,就是当IP是255.255.255.255时,这两个函数会认为这是个无效的IP地址,这是历史遗留问题,其实在目前大部分的路由器上,这个255.255.255.255的IP都是有效的。
而inet_aton函数和上面这两个函数的区别就是在于他认为255.255.255.255是有效的。所以建议多使用这个函数,那两个还是少用为好:)。同时,inet_aton函数返回的是网络字节序的IP地址。
更多详情请参考Linux Man Page。
参见下面的例子:
- #include<unistd.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<netinet/in.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- int main()
- {
- char str[]="255.255.255.255";
- in_addr_t r1,r2,r3;
- struct in_addr inp;
-
- r1=inet_addr(str);
- if(r1==-1)
- {
- printf("inet_addr return -1 when 255.255.255.255\n");
- }
- else
- {
- printf("inet_addr:ip=%lu\n",ntohl(r1));
- }
-
- r2=inet_network(str);
- if(r2==-1)
- {
- printf("inet_network return -1 when 255.255.255.255\n");
- }
- else
- {
- printf("inet_network:ip=%lu\n",r2);
- }
-
- r3=inet_aton(str,&inp);
- if(r3==0)
- {
- printf("inet_aton return -1 when 255.255.255.255\n");
- }
- else
- {
- printf("inet_aton:ip=%lu\n",ntohl(inp.s_addr));
- }
-
- return 0;
- }
阅读(2889) | 评论(2) | 转发(1) |