问题
I am using gethostbyname()
to get the ip address of domains in an application.
In some cases invalid addresses like '50.9.49' are checked also.
echo gethostbyname('50.9.49'); // returns 50.9.0.49
In this cases gethostbyname
should return false or the unmodified invalid ip address. however the functions returns the modified IP address 50.9.0.49
.
Looks like a bug in php. The quick fix seems to be to check for invalid numerical addresses before, are there any other suggestions?
回答1:
PHP's gethostbyname
actually uses the results of the underlying OS's gethostbyname
, e.g., from Linux's netdb.h
or Windows' Winsock2.h
. It's those functions that actually produce the return value, not 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));
}
/* }}} */
回答2:
It seems like this is an undocumented feature for how IPs works. As mentioned in the comments for your question, ping 50.9.49
in Windows actually pings 50.9.0.49
. If you enter an adress as a.b.d
, it automatically inserts a zero as c
: a.b.0.d
. If you just enter a.d
, two zeroes are inserted: a.0.0.d
.
This has been tested with both Windows 7 and Debian Linux.
来源:https://stackoverflow.com/questions/10623408/php-gethostbyname-bug