2017-11-09 25 views
0

일부 주소가 10.0.0.0 - 10.255.255.255 범위 내에 있는지 알고 싶습니다.ipv4 주소 비교 - sockaddr_in

int localAddress = 0; 
struct sockaddr_in localOneFirst; 
struct sockaddr_in localOneLast; 

inet_pton(AF_INET, "11.0.0.0", &(address.sin_addr)); 
inet_pton(AF_INET, "10.0.0.0", &(localOneFirst.sin_addr)); 
inet_pton(AF_INET, "10.255.255.255", &(localOneLast.sin_addr)); 

if((address.sin_addr.s_addr >= localOneFirst.sin_addr.s_addr) && (address.sin_addr.s_addr <= localOneLast.sin_addr.s_addr)) { 
    localAddress = 1; 
} 

내 주소 11.0.0.0은 10.255.255.255보다 큽니다. 그러나이 프로그램에서는 그렇지 않습니다.

"address.sin_addr.s_addr"값이 11이고 "localOneFirst.sin_addr.s_addr"값이 더 크기 때문입니다.

그럼 일부 주소가이 범위에 있는지 어떻게 알 수 있습니까?

+1

가능한 복제 [C에서 소켓 주소를 비교하는 방법?] (https://stackoverflow.com/questions/15461350/how-to-compare-socket -address-in-c) – v1bri

+0

아니요, 다릅니다. –

+0

문제가 무엇인지 잘 모릅니다. 32 비트 정수의 첫 번째 옥텟을 비교하거나 이미 점으로 표시된 표현이 있으므로 첫 번째 점 앞에있는 숫자를 비교하십시오. – SergeyA

답변

0

sockaddr_in 주소는 네트워크 바이트 순서 (빅 엔디안)로 저장됩니다. 빅 엔디 언 시스템에서 코드가 실행 중이면 값이 올바르게 비교되지 않습니다.

사용 ntohl() 값을 비교 :

bool localAddress = (
    (ntohl(address.sin_addr.s_addr) >= ntohl(localOneFirst.sin_addr.s_addr)) && 
    (ntohl(address.sin_addr.s_addr) <= ntohl(localOneLast.sin_addr.s_addr)) 
);