내가 (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++ 프레임 워크를 사용합니다.
내가 (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++ 프레임 워크를 사용합니다.
먼저 각 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 주소 클래스에 텍스트로 변환 덮여있다
대단히 감사합니다! 나는 그것을 시도해 볼 것이다 – Richard
. 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;
}
대단히 감사합니다. 방금 문서에서 찾았습니다. – Richard
+1 아, QT가 이런 걸 가지고 있다는 것을 몰랐다. 내 대답보다 간단하다 :-) –
, 나는 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 라인 하트의 대답은 정말 도움이됩니다.
+1 좋은 직장. 나는 그것이 존재하고 작동하는 내장 기능을 확실히 사용할 것이다. 그러나 나는 당신을 위해 약간의 통찰력을 제공 할 수있어서 기쁩니다. –
[무엇을 시도해 봤습니까?] (http://whathaveyoutried.com/)? 문제를 간단한 단계로 세분하고 하나씩 완료하십시오. –