2013-04-22 4 views
0

제가 누락 된 것인지 확실하지 않습니다.C에서 문자열 형식의 2 IP 주소를 비교

std::string one("200.0.0.0"); 
std::string two("172.27.12.32"); 
std::string three("255.255.255.255"); 

long one_addr = inet_addr(one.c_str()); 
long two_addr = inet_addr(two.c_str()); 
long three_addr = inet_addr(three.c_str()); 

one_addr이 같다 : 내가 IP 주소 172.27.12.32 IP 주소 20.0.0.0과 255.255.252.0의 범위 내에 있는지 확인하려고은

내가 뭐하는 거지하면 다음과 같다 200 two_addr는 537,664,428 three_addr 같다하는 4294967295

two_addr 172.27.12.32 one_addr 그러나이 범위 내에없는보다 큰 같으면 최소 IP 어드레스가 200.0.0.0 인

172.27.12.32가 200.0.0.0과 255.255.255.255의 범위에 있지 않은지 어떻게 결정합니까?

+2

'std :: string'을 사용하여 c 태그를 C++로 변경하십시오. – hmjd

+1

왜 나는 당신이 잘못한 일을 당하고 있다고 느낍니다. 나는 IP 주소 1이 마스크 3에 의해 IP 주소 2 안에 있는지 묻는다. – evilruff

+0

모두 3 개의 모든 IP 주소 – reza

답변

4

힌트 :이 종종에 대한 형식 정의입니다

in_addr_t inet_addr(const char *cp); 

: =) (http://www.stev.org/post/2012/08/09/C++-Check-an-IP-Address-is-in-a-IPMask-range.aspx) 충분히 귀하의 질문에 대답하기 위해

uint32_t IPToUInt(const std::string ip) { 
    int a, b, c, d; 
    uint32_t addr = 0; 

    if (sscanf(ip.c_str(), "%d.%d.%d.%d", &a, &b, &c, &d) != 4) 
     return 0; 

    addr = a << 24; 
    addr |= b << 16; 
    addr |= c << 8; 
    addr |= d; 
    return addr; 
} 

희망 그게 전부는

+0

감사합니다. – reza

0

inet_addr() functionin_addr_t 구조체의 인스턴스를 반환 32 비트 정수로 모든 아키텍처에서 항상 길지는 않습니다.

어쨌든 20.0.0.0255.255.252.0in_addr_t 값으로 변환하는 것을 고려하십시오. 그런 다음 그 결과를 관심있는 가치와 비교하십시오. 너는 무엇을 기대 하느냐?

관련 문제