2012-05-16 2 views
6

gethostbyname()을 사용하여 응용 프로그램에서 도메인의 IP 주소를 가져옵니다.PHP : gethostbyname 버그

경우에 따라 '50 .9.49 '와 같은 잘못된 주소도 선택됩니다. 이 경우 gethostbyname에서

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

는 허위 또는 수정되지 않은 잘못된 IP 주소를 반환해야합니다. 그러나 함수는 수정 된 IP 주소 50.9.0.49을 반환합니다.

PHP의 버그처럼 보입니다. 빠른 수정 이전에 잘못된 숫자 주소를 확인하는 것, 다른 제안이 있습니까? 기본 OS의 gethostbyname, 예를 들어, 리눅스의 netdb.h 또는 Windows 'Winsock2.h에서의

+0

어떤 PHP 버전입니까? –

+3

필자는 PHP가 이러한 상황이 발생하는 유일한 곳이 아니라고 생각합니다. Windows에서'ping 50.9.49 '를 사용할 때도 발생합니다. 나는 응답을 받는다 : '핑핑 50.9.0.49와 32 바이트의 데이터 ...' –

+0

@ 사이먼 그 경우 그 버그가 아니야 –

답변

7

PHP의 gethostbyname 실제로 uses 결과. 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

IP가 작동하는 방법에 대해서는 문서화되지 않은 기능인 것처럼 보입니다. 질문에 대한 의견에서 언급했듯이 Windows의 ping 50.9.49은 실제로 50.9.0.49을 ping합니다. 주소를 a.b.d으로 입력하면 0이 자동으로 c : a.b.0.d으로 삽입됩니다. a.d을 입력하면 두 개의 0이 삽입됩니다 : a.0.0.d.

이 내용은 Windows 7과 Debian Linux에서 모두 테스트되었습니다.

+1

사실 그것은 그 이상입니다. 세 번째 "옥텟"은 16 비트 값으로 처리됩니다. 772가 0x0304이기 때문에'1.2.772' 핑은'1.2.3.4'를 얻습니다. 실제로 'ping 16909060' (0x01020304)하면 동일한 결과를 얻을 수 있습니다! – duskwuff

+1

'ping 50'은 당신에게'0.0.0.50'을줍니다. –