PHP: gethostbyname bug


PHP: gethostbyname bug

我正在使用gethostbyname()来获取应用程序中域的IP地址。

在某些情况下,还会检查无效地址,例如"50.9.49"。

echo gethostbyname('50.9.49'); // returns 50.9.0.49

在这种情况下gethostbyname应返回 false 或未修改的无效 IP 地址。 但是,这些函数返回修改后的 IP 地址50.9.0.49

看起来像 php 中的一个错误。快速修复似乎是之前检查无效的数字地址,还有其他建议吗?

PHP的gethostbyname实际上使用底层操作系统gethostbyname的结果,例如,来自Linux的netdb.h或Windows的Winsock2.h。实际产生返回值的是那些函数,而不是 PHP。

/* {{{ php_gethostbyname */
static char *php_gethostbyname(char *name)
{
    struct hostent *hp;
    struct in_addr in;
    hp = gethostbyname(name);
    if (!hp || !*(hp->h_addr_list)) {
        return estrdup(name);
    }
    memcpy(&in.s_addr, *(hp->h_addr_list), sizeof(in.s_addr));
    return estrdup(inet_ntoa(in));
}
/* }}} */

这似乎是IP工作方式的未记录功能。正如您的问题的评论中所述,Windows 中的ping 50.9.49实际上 ping 50.9.0.49 .如果输入地址作为a.b.d,它会自动插入零作为ca.b.0.d。如果只输入 a.d ,则插入两个零:a.0.0.d

这已经在Windows 7和Debian Linux上进行了测试。