我正在使用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
,它会自动插入零作为c
:a.b.0.d
。如果只输入 a.d
,则插入两个零:a.0.0.d
。
这已经在Windows 7和Debian Linux上进行了测试。