PHP:gethostbyname错误

时间:2012-05-16 17:14:00

标签: php ip gethostbyname

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

在某些情况下,也会检查无效地址,例如'50 .9.49'。

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

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

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

2 个答案:

答案 0 :(得分:7)

PHP的gethostbyname实际uses底层操作系统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));
}
/* }}} */

答案 1 :(得分:3)

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

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