2

我按照这个问题和答案将 IP 地址(数字和点表示法)转换为其各自的无符号整数等效项。换句话说,我使用了 inet_aton 函数

我用 c 编写了一个非常快速的程序来测试该功能。以下是代码:

int main(int argc, char** argv) {
    char* ip1 = "125.113.200.068";
    char* ip2 = "125.113.200.068";
    struct in_addr ip1s;
    inet_aton(ip1, &ip1s);
    struct in_addr ip2s;
    inet_aton(ip2, &ip2s);

    if (ip1s.s_addr == ip2s.s_addr) {
        printf("equal: %u = %u", ip1s.s_addr, ip2s.s_addr);
    }else{
        printf("not equal: %u != %u", ip1s.s_addr, ip2s.s_addr);
    }

    return (EXIT_SUCCESS);
}

尽管两个字符串给出了相同的 ip,但我得到以下输出:

不等于:15774463!= 0

此外,如果我删除 0 以将 ips 设置为 125.113.200.68,则该函数返回两个相等的无符号整数。前面的 0 是否会使 IP 无效?但如果是这种情况,为什么我在前一个示例中得到一个 ips 的非零值?

4

1 回答 1

3

您必须检查inet_aton的返回值:

inet_aton()如果地址有效则返回非零,如果地址无效则返回零。

您的地址无效。068由于前导零而被解释为八进制,并且8不是有效的八进制数字。如果inet_aton失败,它不会改变in_addr结构,所以你打印出来的是随机堆栈垃圾。

无论如何,inet_aton不​​推荐用于新代码。改为使用inet_pton

于 2013-04-03T22:44:10.003 回答