2012-07-04 1 views
1

perl에서 gethostbyname 함수에 잘못된 형식의 IP가 주어지면 어떻게됩니까? 우리 스크립트 중 하나가 틀린 형식의 IP (1.1.1)를 받았을 때 이상하게 행동했습니다. 디버깅 할 때, gethostbyname은 1.1.1에 주어진 값을 반환한다는 것을 발견했습니다. 이것에 대한 생각은 ... ... 제 생각에 gethostbyname은 undef를 리턴해야합니다, 맞습니까?perl gethostbyname 주어진 IP시

+2

이 덧붙여,의 IPv4/IPv6를 투명 호환성을 위해 당신은 아마 소켓'호출되고 싶지 같은 주소 :: 아니라 IPv4 전용 기존'gethostbyname' 해결보다는 getaddrinfo'을 인코딩 다음과 같습니다. – LeoNerd

+0

답변을 주셔서 감사합니다, Alan and LeoNerd. 예 gethostbyname은 세 번째 옥텟에 '0'을 추가하므로 사용자가 잘못된 3 옥텟 IP를 입력하는 경우에도 스크립트가 올바른 출력을 제공합니다. 이 문제를 해결하는 방법? – user1500970

+0

사용자 입력이 잘못되지 않았습니다. 형식 요구 사항이 더 엄격하다는 것을 검증하려면, 그렇게해야합니다. 아마도 정규식 테스트 일 것입니다. 하지만이 값은 다양한 주소 구문 분석 함수에 의해 완벽하게 수용 가능하므로 거부해야하는 이유는 알 수 없습니다. – LeoNerd

답변

3

IPv4의 시작 부분에서 CIDR 이전에는 주소가 네트워크 부분과 호스트 부분으로 구성된 것으로 간주되었습니다. 파트는 점 분리 10 진수 형식으로 독립적으로 작성 될 수 있으며 완전히 바이트로 분해 할 필요는 없습니다. 따라서 1.1은 네트워크 1의 호스트 1이며 1.0.0.1과 같거나 하나의 큰 32 비트 번호 : 16777217로 작성할 수 있습니다. 사람들이 http://16777127/과 같은 URL을 사용하여 얼마나 영리했는지 보여줄 수있는 시간이있었습니다. 스팸 발송자가 필터를 속일 때 스패머가 그렇게하기 시작했을 때 망가졌습니다.

아무튼, 내가 핑 1.1.1 때, 그것은 1.1.0.1로갑니다. 나는 1.0.1.1을 추측했을 것이다. 나는 그것이 어떻게 정확하게 깨 졌는지를 결정하는 것이 무엇인지 모르겠습니다.

이 오래된 양식은 더 이상 지원되지 않거나 이해되지는 않지만 모든 도구와 라이브러리에서 완전히 뿌리를 내리지 못했습니다.

P. 이 답변을 제출하기위한 첫 시도에서 stackoverflow는 다음과 같이 말했습니다.

게시물에 잘못된 도메인 '16777127'에 대한 링크가 포함되어 있습니다. 전체 도메인을 지정하거나 코드 블록에 배치하여 수정하십시오.

"널리 지원되지 않음"이 의미하는 것과 같습니다.

+0

죄송합니다. 내 번호가 일치하지 않았습니다. 16777127은 16777217이어야합니다. 0x01000001입니다. 오 그래 그래도 gethostbyname도 역사적으로 8 진수와 16 진수를 허용한다는 것을 언급하지 않았기 때문에 어떤 파티 푸줏간주도 나타나지 않고 사용하지 않으면 0x01000001도 호스트 이름으로 작동합니다. –

2

숫자 IPv4 주소는 1, 2, 3 또는 4 숫자 구성 요소로 쓸 수 있습니다. 각 비 최종 구성 요소는 8 비트 (1 옥텟)를 나타내며 최종 비트는 전체 32 비트 주소를 제공하는 데 필요한 많은 비트를 나타냅니다. 따라서 다음은 모두 로컬 루프백 주소를 나타냅니다.

2130706433 
127.1 
127.0.1 
127.0.0.1 

각 구성 요소 자체는 10 진수, 16 진수 또는 8 진수로 쓸 수 있습니다. 따라서 모든 또한

0x7f000001 
127.0x01 
0177.0.1 
0x7f.0.0.1 
관련 문제