C IP到无符号整数不匹配

C IP到无符号整数不匹配,c,ip,C,Ip,我按照问题和答案将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); st

我按照问题和答案将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无效?但是如果是这样的话,为什么在前一个例子中我得到了一个非零值

您必须检查的返回值:

inet\u aton()
如果地址有效,则返回非零;如果地址无效,则返回零

你的地址无效<由于前导零,
068
被解释为八进制,并且
8
不是有效的八进制数字。如果
inet\u aton
失败,它不会更改\u addr结构中的
,因此打印出来的是随机堆栈垃圾


在任何情况下,新代码都不建议使用
inet\u aton
。改用

也就是说,如果要将
AF\u INET
作为地址族传递,那么
INET\u aton
INET\u pton
之间的差异可以忽略不计。这个建议实际上相当于“编写支持IPv6的应用程序”。仅仅使用
inet\u pton
代替
inet\u aton
有点遗漏了一点:-)IIRC
inet\u aton
也不是完全可移植的。它适用于大多数BSD联网系统,但在某些系统上不存在,如Windows(在Winsock2下)。