2012-05-16 7 views
6

Estoy usando gethostbyname() para obtener la dirección IP de los dominios en una aplicación.PHP: gethostbyname error

En algunos casos, también se verifican las direcciones no válidas como '50 .9.49 '.

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

En estos casos gethostbyname deberían volver falsa o la dirección IP no válida sin modificar. sin embargo, las funciones devuelven la dirección IP modificada 50.9.0.49.

Parece un error en php. La solución rápida parece ser verificar las direcciones numéricas no válidas antes, ¿hay alguna otra sugerencia?

+0

¿Qué versión de PHP? –

+3

Creo que PHP no es el único lugar donde sucede esto. También ocurre cuando se usa 'ping 50.9.49' en Windows. Recibo la respuesta: 'Pinging 50.9.0.49 con 32 bytes de datos ...' –

+0

@Simon En ese caso, no es un error –

Respuesta

7

gethostbyname realidad uses los resultados de PHP del sistema operativo subyacente de gethostbyname, por ejemplo, a partir de Linux o Windows netdb.hWinsock2.h. Son esas funciones las que realmente producen el valor de retorno, no 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)); 
} 
/* }}} */ 
3

Parece que esta es una característica no documentada de cómo funcionan las IP. Como se mencionó en los comentarios para su pregunta, ping 50.9.49 en Windows realmente hace pings 50.9.0.49. Si ingresa una dirección como a.b.d, inserta automáticamente un cero como c: a.b.0.d. Si solo ingresa a.d, se insertan dos ceros: a.0.0.d.

Esto ha sido probado con Windows 7 y Debian Linux.

+1

Realmente va más allá de eso: el tercer "octeto" se trata como un valor de 16 bits. Al hacer ping en '1.2.772' obtienes '1.2.3.4', ya que 772 es 0x0304. De hecho, puede 'ping 16909060' (0x01020304) para obtener el mismo resultado. – duskwuff

+1

'ping 50' te consigue' 0.0.0.50'. –