2012-09-11 4 views
4

내가 (CIDR 형식) IP 목록을 다음 한 사용하여 주어진 IP 목록에 속하는지 여부를 확인하는 방법 : <내 인터넷 IP는 TXT 파일에 저장 Qt는

58.200.0.0/13 
202.115.0.0/16 
121.48.0.0/15 
219.224.128.0/18 
... 

을하지만 어떻게 할 수 모르겠어요 내 IP가이 목록에 속하는지 여부를 결정합니다. Windows 플랫폼에서 Qt C++ 프레임 워크를 사용합니다.

+1

[무엇을 시도해 봤습니까?] (http://whathaveyoutried.com/)? 문제를 간단한 단계로 세분하고 하나씩 완료하십시오. –

답변

8

먼저 각 CIDR 표기법 범위를 네트워크 (점선 IP 주소) 부분과 여러 비트로 구분해야합니다. 이 비트 수를 사용하여 마스크를 생성하십시오. 그런 다음, 당신은 단지 운영 체제가하는 것처럼, (range & mask) == (your_ip & mask) 경우 테스트 할 필요가 :

일부 사이비-C 코드 : 당신은 아마이 당신을 도울 수있는 라이브러리를 찾을 수

my_ip = inet_addr(my_ip_str)   // Convert your IP string to uint32 
range = inet_addr(CIDR.split('/')[0]) // Convert IP part of CIDR to uint32 

num_bits = atoi(CIDR.split('/')[1])  // Convert bits part of CIDR to int 
mask = (1 << num_bits) - 1    // Calc mask 

if (my_ip & mask) == (range & mask) 
    // in range. 

합니다. 부스트는 IP4 class이며, 연산자는 <>입니다. 하지만 CIDR 표기법을 사용하여 작업해야합니다.

참고 : 이전의 답변은 이미 IP 주소 클래스에 텍스트로 변환 덮여있다

+0

대단히 감사합니다! 나는 그것을 시도해 볼 것이다 – Richard

5

. QHostAddress::isInSubnet()을 사용하여 범위를 확인할 수 있습니다. 이것은 IP 주소가 제공된 주소와 마스크 내에있을 때 true를 반환합니다. IP 주소 zeroconfig (169.254.254.255에 169.254.1.0) 인 경우 예를 들어

가 여기에 확인하는 예입니다 Qt의 문서를 통해 걷기

bool IsZeroconfig(const QHostAddress &ipAddress) 
{ 
    QPair<QHostAddress, int> rangeZeroconfig = QHostAddress::parseSubnet("169.254.0.0/16"); 

    if (ipAddress.isInSubnet(rangeZeroconfig)) 
    { 
     QPair<QHostAddress, int> preZeroconfig = QHostAddress::parseSubnet("169.254.1.0/24"); 
     QPair<QHostAddress, int> postZeroconfig = QHostAddress::parseSubnet("169.254.255.0/24"); 

     if ((!ipAddress.isInSubnet(preZeroconfig)) && (!ipAddress.isInSubnet(postZeroconfig))) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
+0

대단히 감사합니다. 방금 문서에서 찾았습니다. – Richard

+0

+1 아, QT가 이런 걸 가지고 있다는 것을 몰랐다. 내 대답보다 간단하다 :-) –

6

, 나는 QHostAddress :: parseSubnet (우연히 만났다 const QString & 서브넷), CIDR 스타일의 IP 범위를 사용할 수 있으며 Qt 4.5에서 새로 추가되었습니다. 따라서 나는 그것을 해결하기 위해 다음과 같은 코드를 작성할 수 있습니다 (가정 MyIP에이 유형의 QHostAddress입니다) 문제에 대한 이해와 통찰력으로

if(myIP.isInSubnet(QHostAddress::parseSubnet("219.224.128.0/18")) { 
    //then the IP belongs to the CIDR IP range 219.224.128.0/18 
} 

, @Jonathon 라인 하트의 대답은 정말 도움이됩니다.

+0

+1 좋은 직장. 나는 그것이 존재하고 작동하는 내장 기능을 확실히 사용할 것이다. 그러나 나는 당신을 위해 약간의 통찰력을 제공 할 수있어서 기쁩니다. –