Inet_aton()返回无效IP地址成功

inet_aton() returning success for invalid ip addresses?

本文关键字:无效 IP 地址 成功 返回 aton Inet      更新时间:2023-10-16

我正在寻找一些函数来验证,如果给定字符串是一个有效的ipv4地址,但是inet_aton()似乎对像"11"answers"1.1"这样的字符串很满意
验证ipv4字符串的最佳方法是什么?

#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 addressn");
        exit(EXIT_FAILURE);
    }
   printf("%sn", inet_ntoa(addr));
    exit(EXIT_SUCCESS);
}

一些无效字符串的输出是

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

我想要一个例程来拒绝任何非点分十进制的字符串X.x.x.x, x从0到255

这是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函数,该函数在接受的格式方面有更多的限制。