2013-05-01 67 views
2

我正在寻找一些函数来验证,如果给定的字符串是一个有效的ipv4地址, 但inet_aton()似乎很喜欢字符串像“11”和“1.1”
验证ipv4字符串的最佳方法是什么。inet_aton()返回无效IP地址的成功?

#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 

int 
main(int argc, char *argv[]) 
{ 
    struct in_addr addr; 

    if (argc != 2) { 
     fprintf(stderr, "%s <dotted-address>\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 

    if (inet_aton(argv[1], &addr) == 0) { 
     fprintf(stderr, "Invalid address\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("%s\n", inet_ntoa(addr)); 
    exit(EXIT_SUCCESS); 
} 

的输出中的一些无效的字符串

[[email protected] ~]# ./a.out 1.1 
1.0.0.1 
[[email protected] ~]# ./a.out "1 some junk" 
0.0.0.1 
[[email protected] ~]# ./a.out "10 some junk" 
0.0.0.10 

我想一个程序来不拒绝任何字符串点分十进制格式 XXXX,X从0到255

+0

你可以检查这个帖子来验证一个ipv4字符串。 http://stackoverflow.com/questions/791982/determine-if-a-string-is-a-valid-ip-address-in-c – 2013-05-01 21:58:47

+3

'1.1'是一个有效的IP4地址,意思是1.0 .0.1' – deepmax 2013-05-01 22:02:51

+0

inet_aton的行为与其联机帮助页中所述的行为http://linux.die.net/man/3/inet_aton – jman 2013-05-01 22:04:45

回答

3

这是指定的/记录在案的行为为inet_aton

如果你想只接受点分十进制形式,用途:

unsigned char *a = (void *)&addr, dummy; 
if (sscanf(src, "%3hhd.%3hhd.%3hhd.%3hhd%c", a, a+1, a+2, a+3, &dummy)!=4) { 
    /* error */ 
} 

或者,您可以使用inet_pton功能,这是它接受的格式更加严格。